简单最小生成树
#include <iostream> #include <cstring> #include <cmath> #define inf 100000000 using namespace std; int n; double map[250][250],lowc[250]; bool vis[250]; struct node { int x,y; }cell[150]; double dis(node a,node b) { return sqrt(1.0*(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } double prim() { int i,j,p; double minc,res=0; memset(vis,0,sizeof(vis)); vis[0]=1; for(i=1;i<n;i++) lowc[i]=map[0][i]; for(i=1;i<n;i++) { minc=inf; p=-1; for(j=0;j<n;j++) if(vis[j]==0 && minc>lowc[j]) { minc=lowc[j]; p=j; } if(inf==minc) return -1; if(res<minc) res=minc; if(p==1) break; vis[p]=1; for(j=0;j<n;j++) if(vis[j]==0 && lowc[j]>map[p][j]) lowc[j]=map[p][j]; } return res; } int main() { int i,j,case_t=0,fg=0; double d; while(scanf("%d",&n)!=EOF && n) { if(fg) printf("/n"); fg=1; case_t++; for(i=0;i<n;i++) scanf("%d%d",&cell[i].x,&cell[i].y); for(i=0;i<n;i++) for(j=0;j<n;j++) { map[i][j]=dis(cell[i],cell[j]); } printf("Scenario #%d/n",case_t); printf("Frog Distance = %.3lf/n",prim()); } return 0; }