HDU 1875 畅通工程再续 (最小生成树)

畅通工程再续

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


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
2 2 10 10 20 20 3 1 1 2 2 1000 1000
 

 

Sample Output
1414.2 oh!
 

 

Author
8600
 

 

Source
 

 

Recommend
lcy
 
最小生成树
kruskal算法,只是这里先把坐标处理一下,然后就和HDU 1863 一样了
 1 #include<cstdio>

 2 #include<cmath>

 3 #include<cstring>

 4 #include<stdlib.h>

 5 #include<algorithm>

 6 using namespace std;

 7 const int MAXN=10000+5000;

 8 struct point

 9 {

10     int x;

11     int y;

12 }po[MAXN];

13 

14 struct node

15 {

16     int star;

17     int en;

18     double dis;

19     bool operator<(const node&B)const

20     {

21         return dis<B.dis;

22     }

23 }a[MAXN];

24 int p[MAXN];

25 int Find(int x)

26 {

27     return p[x]==x?x:p[x]=Find(p[x]);

28 }

29 

30 double distans(int x1,int y1,int x2,int y2)

31 {

32     return sqrt((double)(x1-x2)*(x1-x2)+(double)(y1-y2)*(y1-y2));

33 }

34 

35 int main()

36 {

37     //freopen("in.txt","r",stdin);

38     int kase;

39     scanf("%d",&kase);

40     while(kase--)

41     {

42         int n,cnt=1;

43         double ans=0;

44         scanf("%d",&n);

45         for(int i=1;i<=n;i++)

46             scanf("%d %d",&po[i].x,&po[i].y);

47         for(int i=1;i<n;i++)

48         {

49             for(int j=i+1;j<=n;j++)

50             {

51                 double temp=distans(po[i].x,po[i].y,po[j].x,po[j].y);

52                 if(10.0<=temp&&temp<=1000.0)

53                 {

54                     a[cnt].star=i;

55                     a[cnt].en=j;

56                     a[cnt].dis=temp;

57                     cnt++;

58                 }

59             }

60         }

61         sort(a+1,a+cnt+1);

62         for(int i=1;i<=cnt;i++)

63             p[i]=i;

64         int sum=0;

65         for(int i=1;i<=cnt;i++)

66         {

67             int x=Find(a[i].star);

68             int y=Find(a[i].en);

69             //printf("x=%d,y=%d",x,y);

70             if(x!=y)

71             {

72                 p[x]=y;

73                 ans+=a[i].dis;

74                 sum++;

75                 if(sum==n-1)

76                     break;

77             }

78         }

79         //printf("%d",sum);

80         if(sum==n-1)

81             printf("%.1lf\n",ans*100);

82         else

83             printf("oh!\n");

84     }

85     return 0;

86 }
View Code

 

你可能感兴趣的:(最小生成树)