UVA - 10034 Freckles kruskal算法

来源:互联网 发布:adobe cc mac 注册机 编辑:程序博客网 时间:2024/04/30 22:21

题目大意:有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;}


0 0