记录编号 193636 评测结果 AAAAAAAAAA
题目名称 [USACO Dec07] 建造路径 最终得分 100
用户昵称 Gravatarforever 是否通过 通过
代码语言 C++ 运行时间 0.535 s
提交时间 2015-10-15 06:23:37 内存使用 16.56 MiB
显示代码纯文本
#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
struct dd{
	int Begin,End;
	double juli;
}jie[1000505];
int jk,n,m,fa[1005],ai,bi,sum;
double data,x[1005],y[1005];
bool vis[1005][1005];
int find(int x){
	if(fa[x]==x) return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
double Dis(int xo,int yo){
	return sqrt((x[xo]-x[yo])*(x[xo]-x[yo])+(y[xo]-y[yo])*(y[xo]-y[yo]));
}
bool comp(const dd & a,const dd & b){
	return a.juli<b.juli;
}
int main(){
    freopen("roads.in","r",stdin);
	freopen("roads.out","w",stdout);
	int yu,lin;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;++i) {
		scanf("%lf%lf",&x[i],&y[i]); fa[i]=i;
	}
	for(int i=1;i<=m;++i) {
		scanf("%d%d",&ai,&bi);
		jie[++jk].Begin=ai; jie[jk].End=bi; jie[jk].juli=0;
		jie[++jk].Begin=bi; jie[jk].End=ai; jie[jk].juli=0;
		vis[ai][bi]=1;
	}
	for(int i=1;i<=n;++i)
	 for(int j=1;j<i;++j){
	   if(i!=j&&!vis[i][j]){
		  double temp=Dis(i,j);
		  jie[++jk].Begin=i; jie[jk].End=j; jie[jk].juli=temp;
		  jie[++jk].Begin=j; jie[jk].End=i; jie[jk].juli=temp;
		  vis[i][j]=1;
	   }
	 }
	 sort(jie+1,jie+jk+1,comp);
	 for(int i=1;i<=jk;++i){
	   yu=find(jie[i].Begin); lin=find(lin=jie[i].End);
	   if(yu!=lin) {
			fa[lin]=yu;
			data+=jie[i].juli;
			sum++;
	   }
	   if(sum==n-1) break;
	 }
	 printf("%.2lf",data);
	 getchar();getchar();
}