相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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!
代码:
思路正确,就是一编译就弹出一页程序,学长说stl调用有问题,我还未找到...代码先放着,慢慢找
1 #include<cstdio> 2 #include<math.h> 3 #include<algorithm> 4 using namespace std; 5 int par[110]; 6 struct note 7 { 8 int st; 9 int endd; 10 int quan; 11 }p[101]; 12 struct xy 13 { 14 int x; 15 int y; 16 }q[101]; 17 bool cmp(note x,note y) 18 { 19 return x.quan<y.quan; 20 } 21 double distance(xy a,xy b) 22 { 23 double sum; 24 sum=sqrt((double)(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); 25 return sum; 26 } 27 int pan(double x) 28 { 29 if(x>=10&&x<=1000) 30 return 1; 31 else return 0; 32 } 33 34 int find(int x) 35 { 36 if(x!=par[x]) 37 return par[x]=find(par[x]); 38 return par[x]; 39 } 40 void unite(int a,int b) 41 { 42 int fa=find(a); 43 int fb=find(b); 44 if(fa!=fb) 45 { 46 par[fa]=fb; 47 } 48 } 49 int main() 50 { 51 int t,n; 52 scanf("%d",&t); 53 while(t--) 54 { 55 scanf("%d",&n); 56 for(int i=1;i<110;i++) 57 par[i]=i; 58 for(int i=1;i<=n;i++) 59 scanf("%d %d",&q[i].x,&q[i].y); 60 int k=1; 61 for(int i=1;i<=n;i++) 62 for(int j=i+1;j<=n;j++) 63 { 64 double m=distance(q[i],q[j]); 65 if(pan(m)) 66 { 67 p[k].st=i; 68 p[k].endd=j; 69 p[k++].quan=distance(q[i],q[j]); 70 71 } 72 73 } 74 sort(p+1,p+k,cmp); 75 double money=0; 76 for(int i=1;i<k;i++) 77 { 78 if(find(p[i].st)!=find(p[i].endd)) 79 { 80 unite(p[i].st,p[i].endd); 81 money+=p[i].quan*100; 82 } 83 } 84 int flag=0; 85 for(int i=1;i<k;i++) 86 if(i==par[i]) 87 flag++; 88 if(flag==1) 89 printf("%.1lf ",money); 90 else printf("oh! "); 91 92 93 } 94 return 0; 95 }