畅通工程再续 (kruskal算法的延续)
Posted 余生漫漫浪
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了畅通工程再续 (kruskal算法的延续)相关的知识,希望对你有一定的参考价值。
个人心得:这题其实跟上一题没什么区别,自己想办法把坐标啥的都给转换为对应的图形模样就好了
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组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 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<vector> 5 #include<cmath> 6 #include<iomanip> 7 #include<algorithm> 8 using namespace std; 9 const long long maxa=99999999; 10 int m; 11 struct place 12 { 13 double a; 14 double b; 15 16 }P[105]; 17 double gets(place x,place y) 18 { 19 return sqrt((x.a-y.a)*(x.a-y.a)+(x.b-y.b)*(x.b-y.b)); 20 21 } 22 struct village 23 { 24 int v; 25 int e; 26 double w; 27 village(int x,int y,double z){ 28 v=x,e=y,w=z; 29 } 30 village(){} 31 bool operator <(const village &V)const 32 { 33 return w<V.w; 34 35 } 36 37 }; 38 vector<village> V; 39 int book[105]; 40 void init() 41 { 42 for(int i=1;i<=m;i++) 43 book[i]=i; 44 45 } 46 int getx(int x) 47 { 48 if(book[x]!=x) 49 book[x]=getx(book[x]); 50 return book[x]; 51 } 52 void mergexy(int x,int y) 53 { 54 book[y]=x; 55 } 56 void getvillage() 57 { 58 for(int i=1;i<=m;i++) 59 for(int j=i+1;j<=m;j++) 60 V.push_back(village(i,j,gets(P[i],P[j]))); 61 } 62 int main() 63 { 64 int t; 65 cin>>t; 66 while(t--) 67 { 68 V.clear(); 69 cin>>m; 70 int x,y; 71 for(int i=1;i<=m;i++) 72 scanf("%lf%lf",&P[i].a,&P[i].b); 73 getvillage(); 74 init(); 75 sort(V.begin(),V.end()); 76 int number=0; 77 double sum=0; 78 for(int i=0;i<V.size();i++) 79 { 80 if(V[i].w>=10&&V[i].w<=1000&&getx(V[i].v)!=getx(V[i].e)){ 81 mergexy(getx(V[i].v),getx(V[i].e)); 82 number++; 83 sum+=V[i].w;; 84 85 } 86 if(number==m-1) break; 87 } 88 sum=sum*100; 89 if(number==m-1) cout<<fixed<<setprecision(1)<<sum<<endl; 90 else cout<<"oh!"<<endl; 91 92 93 } 94 return 0; 95 }
以上是关于畅通工程再续 (kruskal算法的延续)的主要内容,如果未能解决你的问题,请参考以下文章
hdoj1233 还是畅通工程(Prime || Kruskal)