http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=975
最小生成树。
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 #define maxn 1000 6 using namespace std; 7 const double inf=(double)(1<<29); 8 9 int t,n; 10 struct node 11 { 12 double x,y; 13 }p[maxn]; 14 bool vis[maxn]; 15 double dis[maxn]; 16 double g[maxn][maxn]; 17 double ans; 18 19 double sqr(double x) 20 { 21 return x*x; 22 } 23 24 void prim() 25 { 26 memset(vis,false,sizeof(vis)); 27 for(int i=1; i<=n; i++) dis[i]=g[1][i]; 28 dis[1]=0; 29 vis[1]=true; 30 for(int i=1; i<n; i++) 31 { 32 double m=inf; 33 int x; 34 for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]<m) m=dis[x=y]; 35 ans+=m; 36 vis[x]=true; 37 for(int y=1; y<=n; y++) if(!vis[y]&&dis[y]>g[x][y]) dis[y]=g[x][y]; 38 } 39 } 40 41 int main() 42 { 43 scanf("%d",&t); 44 while(t--) 45 { 46 scanf("%d",&n); 47 for(int i=1; i<=n; i++) 48 { 49 scanf("%lf%lf",&p[i].x,&p[i].y); 50 } 51 for(int i=1; i<=n; i++) 52 { 53 for(int j=i; j<=n; j++) 54 { 55 if(i==j) g[i][j]=0; 56 else 57 g[i][j]=g[j][i]=sqrt(sqr(p[i].x-p[j].x)+sqr(p[i].y-p[j].y)); 58 } 59 } 60 ans=0; 61 prim(); 62 printf("%.2lf ",ans); 63 if(t) printf(" "); 64 } 65 return 0; 66 }