ZOJ:1203 Swordfish

来源:互联网 发布:系统工程师 软件开发 编辑:程序博客网 时间:2024/05/16 10:19

题意:给你n个城市的坐标,要求你输出连通所有城市的最小线路长度。

思路:最小生成树。注意每两个样例之间有换行。


#include <cstdio>#include <cmath>#include <iostream>#include <cstring>#include <algorithm>#define MAXN 105using namespace std;struct Edge{    int a,b;    double weight;};bool cmp(Edge x,Edge y){    return x.weight<y.weight;}int father[MAXN];int find(int p){    return p==father[p]?p:(father[p]=find(father[p]));}int main(){    int n,kase=0;    while(scanf("%d",&n)&&n)    {        double x[MAXN],y[MAXN];        for(int i=0; i<n; ++i)            scanf("%lf%lf",&x[i],&y[i]);        Edge p[MAXN*MAXN];        int nn=0;        for(int i=0; i<n; ++i)            for(int j=i+1; j<n; ++j)            {                p[nn].a=i;                p[nn].b=j;                p[nn++].weight=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));            }        sort(p,p+nn,cmp);        for(int i=0; i<=n; ++i)            father[i]=i;        double ans=0;        for(int i=0; i<nn; ++i)        {            int ta=p[i].a,tb=p[i].b;            if(find(ta)!=find(tb))            {                ans+=p[i].weight;                father[find(ta)]=find(father[tb]);            }        }        if(kase) printf("\n");        printf("Case #%d:\n",++kase);        printf("The minimal distance is: %.2lf\n",ans);    }    return 0;}