標籤:style blog http 資料 2014 io
連結:zoj 1203
題意:輸入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;}