题意:输入n个城市的坐标,输出使n个城市连通的最短路线的长度
分析:通过坐标可以将两两之间的长度即权值算出,再用最小生成树的算法
不过这个题要注意输出时的格式问题,两组数据间要空一行
#include<cstdio> #include<cmath> #include<algorithm> using namespace std; int f[110],n,m; struct stu { int a,b; double c; }t[5000]; int cmp(struct stu x,struct stu y) { return x.c<y.c; } int find(int x) { if(x!=f[x]) f[x]=find(f[x]); return f[x]; } double krus() { int i,k=0,x,y; double s; for(i=1;i<m;i++){ x=find(t[i].a); y=find(t[i].b); if(x!=y){ s+=t[i].c; k++; if(k==n-1) break; f[x]=y; } } return s; } int main() { int i,j,k=0; double s,x[110],y[110]; while(scanf("%d",&n)!=EOF){ if(n==0) break; if(k>=1) printf("\n"); k++; for(i=1;i<=n;i++){ scanf("%lf%lf",&x[i],&y[i]); f[i]=i; } m=1; for(i=1;i<=n;i++) for(j=1;j<i;j++){ t[m].a=i; t[m].b=j; t[m++].c=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); //计算两两间的距离 } sort(t+1,t+m,cmp); s=krus(); printf("Case #%d:\nThe minimal distance is: %.2lf\n",k,s); } return 0; }
zoj 1203 Swordfish,布布扣,bubuko.com
时间: 2024-10-12 11:24:54