HDU 1875 畅通工程再续

来源:互联网 发布:探索者软件 编辑:程序博客网 时间:2024/05/20 05:28

最小生成树问题。

先存储各个点的值。

然后再计算边。最后生成树。

#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];struct site{    double x,y;}d[101];int 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;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        for(int i=1;i<=n;i++)        scanf("%lf%lf",&d[i].x,&d[i].y);        int k=0;        for(int i=1;i<=n;i++)        for(int j=i+1;j<=n;j++)        {            double tmp=sqrt(pow(d[i].x-d[j].x,2)+pow(d[i].y-d[j].y,2));            if(tmp>=10&&tmp<=1000)            {                l[k].x=i,l[k].y=j;                l[k].c=tmp,k++;            }        }        sort(l,l+k,cmpa);        intset(n);        double ans=0;        for(int i=0;i<k;i++)        {            int x,y;            x=fa(l[i].x),y=fa(l[i].y);            if(x!=y)            {                a[y]=x;                ans+=l[i].c;            }        }        int ok=0;        for(int i=1;i<=n;i++)        if(a[i]==i)ok++;        if(ok>1)puts("oh!");        else printf("%.1lf\n",ans*100);    }}


0 0