hdu 1875 最小生成树+并查集

来源:互联网 发布:淘宝用什么快递单打印 编辑:程序博客网 时间:2024/06/05 00:55

畅通工程再续

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 11905    Accepted Submission(s): 3648


Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
 

Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
 

Output
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。如果无法实现工程以达到全部畅通,输出”oh!”.
 

Sample Input
2210 1020 2031 12 21000 1000
 

Sample Output
1414.2oh!
 

Author
8600
题目真的比较水,但是自己竟然还是wA了好多次,原来是把1000看成了100,妹的,气死我了


#include<stdio.h>'#include<iostream>#include<cstring>#include<cmath>#define M  1<<30#define D 120struct info{    double x;    double y;}unit[D];double map[D][D];int visit[D];double dis[D];int flag[D];int num;int find(int x){    return flag[x]=(flag[x]==x?x:find(flag[x]));}void merge(int a,int b){    int x=find(a);    int y=find(b);    if(x!=y)    {        flag[x]=y;        num--;    }}double prim(int n){    int i,j,k;    for(i=1;i<=n;i++)    {        dis[i]=map[1][i];    }    dis[1]=0;    for(j=1;j<=n;j++)    {       double t=M;       int pos;       for(i=1;i<=n;i++)       {           if(!visit[i]&&t>dis[i])           {               t=dis[i];               pos=i;           }       }       visit[pos]=1;       for(i=1;i<=n;i++)       {           if(!visit[i]&&dis[i]>map[pos][i]&&map[pos][i]!=M){dis[i]=map[pos][i];//printf("%d   %d\n",i,dis[i]);}       }    }   double sum=0;   /* for(i=1;i<=n;i++)    {        printf("%d\n",dis[i]);    }*/    for(i=1;i<=n;i++)    sum=sum+dis[i];    return sum;}int main(){    int i,j,k;    int e,c;    scanf("%d",&e);      while(e--)      {       scanf("%d",&c);       for(i=1;i<=c;i++)       {           scanf("%lf%lf",&unit[i].x,&unit[i].y);       }       for(i=1;i<=c;i++)       {           for(j=1;j<=c;j++)           {               map[i][j]=M;           }       }        for(i=1;i<=c;i++)        {            flag[i]=i;        }       memset(visit,0,sizeof(visit));       num=c-1;       for(i=1;i<=c;i++)       {           for(j=1;j<=c;j++)           if(i==j)           map[i][j]=0;           else           {double sum=sqrt((unit[i].x-unit[j].x)*(unit[i].x-unit[j].x)+(unit[i].y-unit[j].y)*(unit[i].y-unit[j].y));             if((sum<=1000.0)&&(sum>=10.0))               {                 map[i][j]=sum;                 map[j][i]=sum;                // printf("%d %d\n",i,j);                 merge(i,j);               }           }       }       if(num>0)       {           printf("oh!\n");           continue;       }       double ans=prim(c);       double h=ans*100.0;       printf("%.1lf\n",h);      }    return 0;}


0 0
原创粉丝点击