畅通工程再续
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 15734 Accepted Submission(s): 4872
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!
若两个点满足条件,就在这两个点之间连一条线。然后看有几个根结点,若根结点数目>1则说明图不连通,输出oh!。否则用kruskal就最小生成树即可。
代码:
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <iostream> 5 #include <vector> 6 #include <queue> 7 #include <map> 8 #include <cmath> 9 using namespace std; 10 11 struct node{ 12 int x, y; 13 double w; 14 }a[105*105/2]; 15 16 struct mem{ 17 double x, y; 18 }b[105]; 19 20 int father[105]; 21 int f[105]; 22 int n, m; 23 int ma[105][105]; 24 int visited[105]; 25 int dis[105]; 26 int c[105]; 27 28 int findroot1(int p){ 29 int x=p; 30 while(x!=father[x]) x=father[x]; 31 return x; 32 } 33 34 int findroot2(int p){ 35 int x=p; 36 while(x!=f[x]) x=f[x]; 37 return x; 38 } 39 40 bool cmp(node a,node b){ 41 return a.w<b.w; 42 } 43 44 main() 45 { 46 int i, j, k; 47 int t; 48 double d; 49 cin>>t; 50 while(t--){ 51 scanf("%d",&n); 52 k=0; 53 for(i=0;i<=n;i++) {father[i]=i;f[i]=i;c[i]=1;} 54 for(i=0;i<n;i++) scanf("%lf %lf",&b[i].x,&b[i].y); 55 for(i=0;i<n;i++){ 56 for(j=i+1;j<n;j++){ 57 d=sqrt((double)(b[i].x-b[j].x)*(b[i].x-b[j].x)+(double)(b[i].y-b[j].y)*(b[i].y-b[j].y)); 58 if(d>=10&&d<=1000){ 59 a[k].x=i;a[k].y=j; 60 a[k++].w=d*100.0; 61 father[findroot1(j)]=findroot1(i); 62 } 63 } 64 } 65 int num=0; 66 for(i=0;i<n;i++){ 67 if(i==findroot1(i)) 68 num++; 69 } 70 if(num>1) { 71 printf("oh!\n");continue; 72 } 73 sort(a,a+k,cmp); 74 double ans=0;j=1; 75 for(i=0;i<k;i++){ 76 int fx=findroot2(a[i].x); 77 int fy=findroot2(a[i].y); 78 if(fx!=fy){ 79 ans+=a[i].w; 80 f[fy]=fx; 81 c[fx]+=c[fy]; 82 if(c[fx]>=n) break; 83 } 84 } 85 printf("%.1lf\n",ans); 86 } 87 }
时间: 2024-08-24 14:28:40