UVA - 10034 Freckles kruskal算法

题目大意:有N个点,要求你将所有的点连接起来,求连接的线段的长度和,要求长度和达到最小

解题思路:模板题,就不细说了

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn = 10005;
double x[105],y[105];
double len[maxn];
int r[maxn],p[maxn];

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

int cmp(const int i, const int j) {
	return len[i] < len[j];
}

int main() {
	int test,num;
	scanf("%d",&test);
	while(test--) {

		scanf("%d",&num);
		for(int i = 0; i <= num * num; i++)
			r[i] = p[i] = i;

		for(int i = 0; i < num; i++)
			scanf("%lf%lf",&x[i],&y[i]);
		
		for(int i = 0; i < num; i++)
			for(int j = 0; j < num; j++)
				len[i*num+j] = sqrt( (x[i]-x[j]) * (x[i]-x[j]) + (y[i]-y[j]) * (y[i] - y[j]) );
		
		sort(r,r+num*num,cmp);	
		double ans = 0;	
		for(int i = 0; i < num * num; i++) {
			double e = len[r[i]];
			int x = find(r[i]/num);
			int y = find(r[i]%num);
			if( x != y) {
				ans += e;
				p[x] = y;
			}	
		}
		printf("%.2lf\n",ans);
		if(test)
			printf("\n");
	}
	return 0;
}


阅读更多
个人分类: ACM-图论-生成树
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭