HDU - 1875 畅通工程再续
Problem Description
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 200),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
每组数据首先是一个整数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!
一代模板如下
AC代码:(仅供参考)
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define N 110000 9 10 int father[N]; 11 12 int sum; 13 14 struct no 15 { 16 int x,y; 17 }di[N]; 18 19 struct node 20 { 21 int s,e; 22 double l; 23 }dd[N]; 24 25 int Find(int n) 26 { 27 while(n!=father[n]) 28 n=father[n]; 29 30 return n; 31 } 32 33 void Fin(int x,int y) 34 { 35 int a,b; 36 37 a=Find(x); 38 b=Find(y); 39 40 if(a!=b) 41 { 42 father[b]=a; 43 sum++; 44 } 45 } 46 47 bool cmp(node a, node b) 48 { 49 return a.l < b.l; 50 } 51 52 int main() 53 { 54 int t; 55 56 scanf("%d",&t); 57 58 while(t--) 59 { 60 int c; 61 62 scanf("%d",&c); 63 64 for(int i=0; i<=c; i++) 65 father[i]=i; 66 67 for(int i=0; i<c; i++) 68 scanf("%d%d",&di[i].x, &di[i].y); 69 70 if(c==1) 71 { 72 printf("0.0\n"); 73 continue; 74 } 75 76 int k=0; 77 78 for(int i=0; i<c; i++) 79 for(int j=i+1; j<c; j++) 80 { 81 double mi=sqrt((double)(di[i].x-di[j].x)*(di[i].x-di[j].x)+(double)(di[i].y-di[j].y)*(di[i].y-di[j].y)); 82 83 if(mi >= 10 && mi <= 1000) 84 { 85 dd[k].s=i; 86 dd[k].e=j; 87 dd[k].l=mi; 88 k++; 89 } 90 } 91 92 sort(dd,dd+k,cmp); 93 94 sum=1; 95 double sun=0; 96 97 for(int i=0; i<k; i++) 98 if(Find(dd[i].s) != Find(dd[i].e)) 99 { 100 Fin(dd[i].s,dd[i].e); 101 sun+=dd[i].l; 102 } 103 104 if(sum < c) 105 printf("oh!\n"); 106 else 107 printf("%.1lf\n",sun*100); 108 109 } 110 return 0; 111 }
不甘心,自己再来一
1 #include<cstdio> 2 #include<cmath> 3 #include<cstring> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define N 110000 9 10 int p[N], s; 11 12 struct data 13 { 14 int x, y; 15 }v[N]; 16 17 struct node 18 { 19 int a, b; 20 double l; 21 }d[N]; 22 23 bool cmp(node a, node b) 24 { 25 return a.l < b.l; 26 } 27 28 int Find(int x) 29 { 30 while(p[x] != x) 31 x = p[x]; 32 33 return x; 34 } 35 36 void Fin(int x, int y) 37 { 38 int a = Find(x); 39 int b = Find(y); 40 41 if (a != b) 42 { 43 s++; 44 p[b] = a; 45 } 46 } 47 48 int main() 49 { 50 int T; 51 scanf ("%d", &T); 52 53 while (T--) 54 { 55 int n; 56 57 scanf ("%d", &n); 58 59 for (int i = 0; i <= n; i++) 60 p[i] = i; 61 62 for (int i = 0; i < n; i++) 63 scanf ("%d %d", &v[i].x, &v[i].y); 64 65 int k = 0; 66 67 for (int i = 0; i < n; i++) 68 for (int j = i+1; j < n; j++) 69 { 70 double mi =sqrt((double)(v[i].x - v[j].x)*(v[i].x - v[j].x) + (double)(v[i].y - v[j].y)*(v[i].y - v[j].y)); 71 72 if (mi >= 10 && mi <= 1000) 73 { 74 d[k].a = i; 75 d[k].b = j; 76 d[k].l = mi; 77 k++; 78 } 79 } 80 81 double num = 0; 82 s = 0; 83 sort(d, d+k, cmp); 84 85 for (int i = 0; i < k; i++) 86 if (Find(d[i].a) != Find(d[i].b)) 87 { 88 num += d[i].l; 89 Fin(d[i].a, d[i].b); 90 } 91 92 if (s < n-1) 93 printf ("oh!\n"); 94 else 95 printf ("%.1f\n", 100*num); 96 } 97 return 0; 98 }