HDOJ 1875

畅通工程再续

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

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!
 
prim算法实现:当answer大于inf时说明无法完全联通,输出oh!
 1 #include<stdio.h>
 2 #include<string.h>
 3 #include <math.h>
 4 #define inf 0xffffff
 5 double g[101][101];
 6 int sum;
 7 double ans;
 8 void prim(int n)
 9 {
10     double lowcost[101],min;
11     int used[101],closet[101];
12     int i,j,k;
13     memset(used,0,sizeof(used));
14     for(i=1;i<=n;i++)
15         lowcost[i]=g[i][1],
16         closet[i]=1;
17     used[1]=1;
18     for(i=1;i<n;i++)
19     {
20         min=inf;
21         j=1;
22         for(k=2;k<=n;k++)
23             if(lowcost[k]<min&&!used[k])
24                 min=lowcost[k],j=k;
25         used[j]=1;
26         ans+=g[j][closet[j]];
27         sum++;
28         for(k=2;k<=n;k++)
29         {
30             if(g[k][j]<lowcost[k]&&!used[k])
31                 lowcost[k]=g[k][j],
32                 closet[k]=j;
33         }
34     }
35 
36 }
37 int main()
38 {
39     int a,b,t,i,j,c,k,n;
40     scanf("%d",&t);
41     for(k=1;k<=t;k++)
42     {
43         ans=0;sum=1;
44         scanf("%d",&n);
45         for(i=1;i<=n;i++)
46             for(j=1;j<=n;j++)
47                 g[i][j]=inf;
48         int p[101][2];
49         for(i=1;i<=n;i++)
50             scanf("%d %d",&p[i][0],&p[i][1]);
51         for(i=1;i<=n;i++)
52         {
53             for(j=1;j<=n;j++)
54             {
55                 double len=sqrt(double((p[i][0]-p[j][0])*(p[i][0]-p[j][0])+(p[i][1]-p[j][1])*(p[i][1]-p[j][1])));
56                 if(len>=10&&len<=1000)
57                     g[i][j]=g[j][i]=len;
58             }
59         }
60         prim(n);
61         if(ans>inf)
62             printf("oh!\n");
63         else
64         printf("%.1lf\n",ans*100);
65     }
66     return 0;
67 }
View Code

 

 
9848222 2013-12-17 19:46:20 Accepted 1875 31MS 356K 1187 B C++ 泽泽
posted @ 2013-12-17 19:48  陈泽泽  阅读(318)  评论(0编辑  收藏  举报