#include <iostream>
#include <math.h>
#include <algorithm>
#include <stdio.h>
#include <string.h>
using namespace std;
struct Node
{
double x,y;
};
Node node[800];
int u[800*800];
int v[800*800];
double w[800*800];
int p[800];
int r[800*800];
int n,m;
int cmp(const int i,const int j)
{
return w[i]<w[j];
}
int find(int x)
{
return p[x]==x?x:p[x]=find(p[x]);
}
double kruskal()
{
int x,y,i;
double ans=0;
for(i=1; i<=n; i++) p[i]=i;
int edge;
int n1,n2;
for(i=1; i<m; i++) r[i]=i;
sort(r+1,r+m,cmp);
scanf("%d",&edge);
for(int i=1; i<=edge; i++)
{
scanf("%d%d",&n1,&n2);
int x=find(n1);
int y=find(n2);
if(x!=y)
p[x]=y;
}
for(i=1; i<m; i++)
{
int e=r[i];
x=find(u[e]);
y=find(v[e]);
if(x!=y)
{
ans+=w[e];
p[x]=y;//模板的这个地方忘记修改了
}
}
return ans;
}
int main()
{
// freopen("debug\\in.txt","r",stdin);
// freopen("debug\\out.txt","w",stdout);
while(~scanf("%d",&n))
{
for(int i=1; i<=n; i++)
{
int x,y;
scanf("%d%d",&x,&y);//不能直接输入到结构体里
node[i].x=x;
node[i].y=y;
}
m=1;
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
{
u[m]=i;
v[m]=j;
double dx=node[i].x-node[j].x;
double dy=node[i].y-node[j].y;
w[m++]=sqrt(dx*dx+dy*dy);
}
printf("%.2lf\n",kruskal());
}
return 0;
}
uva10397
最新推荐文章于 2017-11-24 17:25:58 发布