题目大意 :点1到点2,有很多路径,每条路径都有一个最大权值,求所有这些最大权值中的最小权值; 方法:Kruskal算法 #include<iostream> using namespace std; #include<cstdio> #include<cmath> #include<cstdlib> struct Point { int x,y; }; struct Edge { int a,b; double dist; }; Point node[205]; Edge e[20005]; int set[205]; int cmp(const void *a,const void *b) { Edge *c,*d; c=(Edge*)a,d=(Edge*)b; if(c->dist>d->dist) return 1; else return -1; } double Distance(Point p1,Point p2) { return sqrt(((p1.x-p2.x)*(p1.x-p2.x)+ (p1.y-p2.y)*(p1.y-p2.y))*1.0); } int find(int x) { int r=x,i,j; while(r!=set[r]) r=set[r]; i=x; while(i!=r) { j=set[i]; set[i]=r; i=j; } return r; } void merge(int a,int b) { if(a>b) set[a]=b; else set[b]=a; } double kruskal(int d,int n) { int i,h,k; double weight; for(i=1;i<=d;i++) set[i]=i; qsort(e,n,sizeof(e[0]),cmp); for(i=0;i<n;i++) { h=find(e[i].a),k=find(e[i].b); if(h!=k) { merge(h,k); weight=e[i].dist; } if(find(1)==find(2)) break; } return weight; } int main() { int n,i,ca=0,j,t; double m; while(scanf("%d",&n),n) { ca++; for(i=1;i<=n;i++) scanf("%d%d",&node[i].x,&node[i].y); t=0; for(i=1;i<n;i++) for(j=i+1;j<=n;j++) { e[t].a=i,e[t].b=j; e[t].dist=Distance(node[i],node[j]); t++; } m=kruskal(n,t); printf("Scenario #%d/n",ca); printf("Frog Distance = %.3lf/n/n",m); } }