相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。其中桥的价格为 100元/米。
每组数据首先是一个整数C(C <= 100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是 0 <= x, y <= 1000的整数。
2 2 10 10 20 20 3 1 1 2 2 1000 1000
1414.2 oh!
这题的是用一个结构体,存相连的序号和这两个序号相连的长度,写一个cmp,排一下从小到大,然后用一个并查集把序号连接起来,如果两个序号相连就联通了,如果没联通完(也就是num<n)就肯定是oh!.
#include <bits/stdc++.h> //#include <ext/pb_ds/tree_policy.hpp> //#include <ext/pb_ds/assoc_container.hpp> //using namespace __gnu_pbds; using namespace std; #define pi acos(-1) #define endl '\n' #define me(x) memset(x,0,sizeof(x)); #define foreach(it,a) for(__typeof((a).begin()) it=(a).begin();it!=(a).end();it++) typedef long long LL; const int INF=0x3f3f3f3f; const LL LINF=0x3f3f3f3f3f3f3f3fLL; const int dx[]={-1,0,1,0,-1,-1,1,1}; const int dy[]={0,1,0,-1,1,-1,1,-1}; const int maxn=1e3+5; const int maxx=5e4+100; const double EPS=1e-7; const int mod=1000000007; template<class T>inline T min(T a,T b,T c) { return min(min(a,b),c);} template<class T>inline T max(T a,T b,T c) { return max(max(a,b),c);} template<class T>inline T min(T a,T b,T c,T d) { return min(min(a,b),min(c,d));} template<class T>inline T max(T a,T b,T c,T d) { return max(max(a,b),max(c,d));} //typedef tree<pt,null_type,less< pt >,rb_tree_tag,tree_order_statistics_node_update> rbtree; /*lch[root] = build(L1,p-1,L2+1,L2+cnt); rch[root] = build(p+1,R1,L2+cnt+1,R2);中前*/ /*lch[root] = build(L1,p-1,L2,L2+cnt-1); rch[root] = build(p+1,R1,L2+cnt,R2-1);中后*/ long long gcd(long long a , long long b){if(b==0) return a;a%=b;return gcd(b,a);} int _pow(LL a,LL ssss){LL ret=1;while(ssss){if(ssss&1)ret=ret*a%mod;a=a*a%mod;ssss>>=1;}return ret;} int fa[maxn],x[maxn],y[maxn]; struct node { int u,v; double x; }; vector<node>Q; int n; int fi(int x) { return fa[x]==x?x:fa[x]=fi(fa[x]); } bool cmp(node a,node b) { return a.x<b.x; } int get(int x1,int x2,int y1,int y2) { int xx=x1-x2; int yy=y1-y2; return xx*xx+yy*yy; } int main() { int t; cin>>t; while(t--) { Q.clear(); cin>>n; for(int i=1;i<=n;i++) { fa[i]=i; cin>>x[i]>>y[i]; } for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { if(i==j) continue; int tmp=get(x[i],x[j],y[i],y[j]); if(tmp>=100&&tmp<=1000000) { Q.push_back((node){i,j,sqrt((double)tmp)}); } } sort(Q.begin(),Q.end(),cmp); double ans=0; int num=1; for(int i=0;i<Q.size();i++) { // cout<<Q[i].u<<" "<<Q[i].v<<"******"<<endl; int p1=fi(Q[i].u),p2=fi(Q[i].v); // cout<<p1<<"******************* "<<p2<<endl; if(p1!=p2) { fa[p1]=p2; num++; ans+=Q[i].x; } } // cout<<num<<endl; if(num<n) { puts("oh!"); } else printf("%.1lf\n",ans*100); } }