畅通工程再续
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的整数。
每组数据首先是一个整数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 ",ans*100); 82 else 83 printf("oh! "); 84 } 85 return 0; 86 }