3 1.0 1.0 2.0 2.0 2.0 4.0
3.41代码:Kruskal算法:#include<stdio.h> #include<algorithm> #include<math.h> using namespace std; int n; double x[110],y[110]; int per[110]; struct record { int s,e; double w; }num[10000]; bool cmp(record a,record b) { return a.w<b.w; } int init() { for(int i=1;i<=n;i++) { per[i]=i; } } int find(int x) { int r; r=x; while(r!=per[r]) { r=per[r]; } per[x]=r; return r; } int join(int x,int y) { int fx=find(x); int fy=find(y); if(fx!=fy) { per[fx]=fy; return true; } return false; } int main() { int i,j,k; double d,sum; while(scanf("%d",&n)!=EOF) { k=0;sum=0; init(); for(i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { d=sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i])); num[k].s=i; num[k].e=j; num[k].w=d; k++; } } sort(num,num+k,cmp); for(i=0;i<k;i++) { if(join(num[i].s,num[i].e)) { sum+=num[i].w; } } printf("%.2lf\n",sum); } return 0; }Prim算法:#include<stdio.h> #include<string.h> #include<math.h> #define INF 0x3f3f3f int vis[110]; double x[110],y[110],low[110],map[110][110]; int n; int prim() { int i,j,next; double min,sum=0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { low[i]=map[1][i]; } vis[1]=1; for(i=2;i<=n;i++) { min=INF; for(j=1;j<=n;j++) { if(!vis[j]&&min>low[j]) { min=low[j]; next=j; } } sum+=min; vis[next]=1; for(j=1;j<=n;j++) { if(!vis[j]&&low[j]>map[next][j]) { low[j]=map[next][j]; } } } printf("%.2lf\n",sum); } int main() { int i,j; double d; while(scanf("%d",&n)!=EOF) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j) map[i][j]=map[j][i]=0; else map[i][j]=map[j][i]=INF; } } for(i=1;i<=n;i++) { scanf("%lf%lf",&x[i],&y[i]); } for(i=1;i<=n;i++) { for(j=i+1;j<=n;j++) { d=sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i])); map[i][j]=map[j][i]=d; } } prim(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
hdoj 1162 Eddy's picture【最小生成树】
原文:http://blog.csdn.net/longge33445/article/details/47608675