您的位置:首页 > 其它

UVa 10397 Connect the Campus (Kruskal+补全最小生成树)

2015-08-05 10:33 441 查看
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<climits>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<cstring>
#include<string>
using namespace std;

int N,M,E;
const int INF=100000000;
const int maxn=750+10;
const int maxe=750*750+10;
int p[maxn];

struct Point
{
	double x,y;
	Point(double x=0.0,double y=0.0):x(x),y(y){}
};

struct edge
{
	int u,v;
	double cost;
	edge(int u=0,int v=0,double cost=0.0):u(u),v(v),cost(cost){}
};
edge es[maxe];
Point point[maxn];
int used[maxn][maxn];

bool cmp(const edge& e1,const edge& e2)
{
	return e1.cost<e2.cost;
}

int find(int x)
{
	return p[x]==x ? x:p[x]=find(p[x]);
}

double Kruskal()
{
	sort(es,es+E,cmp);
	for(int i=0;i<N;i++)
		p[i]=i;
	double res=0;
	for(int i=0;i<E;i++)
	{
		edge e=es[i];
		int x=find(e.u);
		int y=find(e.v);
		if(x!=y)
		{
			res+=e.cost;
			p[x]=y;
		}
	}
	return res;
}

int main()
{
	while(~scanf("%d",&N))
	{
		memset(used,0,sizeof(used));
		for(int i=0;i<N;i++)
		{
			scanf("%lf%lf",&point[i].x,&point[i].y);
		}
		E=0;
		scanf("%d",&M);
		for(int i=0;i<M;i++)
		{
			int u,v;
			scanf("%d%d",&u,&v);
			u--;
			v--;
			es[E++]=edge(u,v,0);
			used[u][v]=1;
			used[v][u]=1;
		}
		for(int i=0;i<N;i++)
			for(int j=i+1;j<N;j++)
			{
				if(used[i][j])continue;
				else{
					double d=sqrt((point[i].x-point[j].x)*(point[i].x-point[j].x)+(point[i].y-point[j].y)*(point[i].y-point[j].y));
					es[E++]=edge(i,j,d);
				}
			}
		printf("%.2lf\n",Kruskal());
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: