题意:
中文题。
题解:
只要是超过1000米和小于10米的就不放进数组就可以了。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<math.h>
using namespace std;
const int MAXN=105*105;
struct node1
{
double x,y;
}a[105];
struct node2
{
int u,v;
double l;
}map[MAXN];
int fa[105];
int n,k;
bool cmp(node2 c,node2 d)
{
return c.l<d.l;
}
int find(int p)
{
return p==fa[p]? p:fa[p]=find(fa[p]);
}
void Kruskal()
{
int s=0;
double sum=0;
for(int i=0;i<k;i++)
{
int P=find(map[i].u);
int Q=find(map[i].v);
if(P!=Q)
{
sum+=map[i].l;
fa[P]=Q;
s++;
}
}
if(s==n-1)
printf("%0.1lf\n",sum*100);
else
printf("oh!\n");
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
k=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=n;i++)
scanf("%lf%lf",&a[i].x,&a[i].y);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
map[k].u=i;
map[k].v=j;
map[k].l=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
if(map[k].l<=1000&&map[k].l>=10)
k++;
}
sort(map,map+k,cmp);
Kruskal();
}
}