传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1875
揭示一个大坑:题目说到不符合条件的岛屿(即10~1000外距离的岛)是会在输出中出现的,这个大部分人可以想到
还有更坑的,不符合条件的岛屿也算在不连通之内,即如果有不合法的岛屿,那么输出oh!当然,还有可能合法岛屿未被连接。
AC代码:
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
struct land
{
int x,y;
}a[101];
struct node
{
int u,v;
double l;
}es[5001];
int par[101];
int n,m;
bool cmp(node a,node b)
{
return a.l<b.l;
}
int find(int x)
{
if(x!=par[x]) par[x]=find(par[x]);
return par[x];
}
int main()
{
int t;
cin>>t;
while(t--)
{
m=0;
for(int i=0;i<101;i++)par[i]=i;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&a[i].x,&a[i].y);
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
es[++m].u=i;
es[m].v=j;
es[m].l=sqrt((a[i].y-a[j].y)*(a[i].y-a[j].y)+(a[i].x-a[j].x)*(a[i].x-a[j].x));
}
}
sort(es+1,es+m+1,cmp);
double ans=0;
int cnt=0;
for(int i=1;i<=m;i++)
{
int fx=find(es[i].u);
int fy=find(es[i].v);
if(fx!=fy)
{
if(es[i].l<=1000&&es[i].l>=10)
{
par[fx]=fy;
ans+=es[i].l;
cnt++;
}
}
}
if(cnt==n-1) printf("%.1lf\n",ans*100);
else cout<<"oh!\n";
}
return 0;
}