萌新求调,关注解答人
查看原帖
萌新求调,关注解答人
1059077
xmz114514楼主2024/8/8 11:09
#include<bits/stdc++.h>
using namespace std;
const int maxn=1005;
int n;
double mp[maxn][maxn];
struct node{
	int x,y,p;
}e[maxn];
int vis[maxn],used[maxn][maxn];
int par[maxn];
double dis[maxn],dp[maxn][maxn];
double prim(){
	memset(vis,0,sizeof(vis));
	memset(used,0,sizeof(used));
	memset(dp,0,sizeof(dp));
	for(int i=1;i<=n;i++){
		dis[i]=mp[1][i];
		par[i]=1;
	}
	dis[0]=1e9;
	vis[1]=1;
	double sum=0;
	for(int i=1;i<n;i++){
		int k=0;
		for(int j=1;j<=n;j++){
			if(!vis[j]&&dis[j]<dis[k]){
				k=j;
			}
			if(k==0)break;
			vis[k]=1;
			used[par[k]][k]=used[k][par[k]]=1;
			sum+=dis[k];
			for(int j=1;j<=n;j++){
				if(!vis[j]&&mp[k][j]<dis[j]){
					dis[j]=mp[k][j];
					par[j]=k;
				}
				if(vis[j]&&j!=k){
					dp[k][j]=dp[j][k]=max(dp[j][par[k]],dis[k]);
				}
			}
		}
	}
	return sum;
}
int main(){
	int t;
	cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>e[i].x>>e[i].y>>e[i].p;
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				mp[i][j]=sqrt((e[i].x-e[j].x)*(e[i].x-e[j].x)+(e[i].y-e[j].y)*(e[i].y-e[j].y));
			}
		}
		double mst=prim();
		double ans=-1;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				if(i==j){
					continue;
				}
				if(used[i][j]){
					ans=max(ans,(e[i].p+e[j].p)/(mst-mp[i][j]));
				}
				else ans=max(ans,(e[i].p+e[j].p)/(mst-dp[i][j]));
			}
		}
		printf("%.2f\n",ans);
	}
	return 0;
}

2024/8/8 11:09
加载中...