HDU 1162 Eddy's picture

来源:互联网 发布:2017年动漫推荐知乎 编辑:程序博客网 时间:2024/04/28 22:54

最小生成树问题。

把N个点的坐标处理成N*(N-1)/2 条边。

然后生成树。

#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#define INF 100000001using namespace std;int a[101];struct lx{    int x,y;    double c;}l[5001];double x[101],y[101];void intset(int n){    for(int i=0; i<=n; i++)        a[i]=i;}int fa(int x){    if(x!=a[x])        x=fa(a[x]);    return a[x];}bool cmpa(lx t1,lx t2){    return t1.c<t2.c;}int main(){    int n,m,t,k;    while(~scanf("%d",&n))    {        m=0;intset(n);        for(int i=1;i<=n;i++)        scanf("%lf%lf",&x[i],&y[i]);        for(int i=1;i<=n;i++)        for(int j=i+1;j<=n;j++)        {            l[m].x=i,l[m].y=j;            l[m++].c=sqrt(pow(x[i]-x[j],2)+pow(y[i]-y[j],2));        }        sort(l,l+m,cmpa);        double ans=0;        for(int i=0;i<m;i++)        {            int x=fa(l[i].x);            int y=fa(l[i].y);            if(x!=y)            {                ans+=l[i].c;                a[y]=x;            }        }        printf("%.2lf\n",ans);    }}


0 0
原创粉丝点击