1393国防部长

数学上最小生成树的最大边一定是所有生成树中最大边的最小值

#include <bits/stdc++.h>
using namespace std;
int n;
const int N=105;
double x[N];
double y[N];
double cost[N];
double t;
bool vis[N];
double dist[N][N];
int main(){
	while(scanf("%d",&n)!=EOF)
	{	
		memset(vis,0,sizeof(vis));
		double ans=0;
		for(int i=1;i<=n;i++){
			scanf("%lf%lf",&x[i],&y[i]);
		}
		for(int i=1;i<=n;i++){
			for(int j=i;j<=n;j++){
				dist[i][j]=dist[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
			}
		}
		for(int i=2;i<=n;i++){
			cost[i]=dist[1][i];
		}
		vis[1]=1;
		for(int i=2;i<=n;i++){
			t=100000000;
			int k;
			for(int j=2;j<=n;j++){
				if(!vis[j]&&t>cost[j]){
					t=cost[j];
					k=j;
				}
			}
			vis[k]=1;
			ans=max(t,ans);
			for(int j=2;j<=n;j++){
				cost[j]=min(cost[j],dist[k][j]);
			}
		}
		printf("%.2lf\n",ans);
	}
}
posted @ 2026-03-11 00:51  peter_shen  阅读(8)  评论(0)    收藏  举报