本文主要是介绍Freckles【POJ2560】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目链接
kruskal算法+并查集
#include<cstdio>
#include<algorithm>
#include<cmath>
#define N 5000
using namespace std;
struct edge{int u,v;double cost;bool operator < (const edge &b)const{return cost < b.cost;}
}E[N]; struct point{double x,y;double distance(point A){double tmp = (x - A.x)*(x - A.x) + (y - A.y)*(y - A.y);return sqrt(tmp);}
}p[105];
int father[105];
int findFather(int x){if(x == father[x]) return x;else{int tp = findFather(father[x]);father[x] = tp;return tp;}
}
int main(){int n;while(scanf("%d",&n) != EOF){for(int i = 1;i <= n;i++){scanf("%lf%lf",&p[i].x,&p[i].y);}int k = 0; //k用来记录边的条数 for(int i=1;i<=n;i++){for(int j=1;j<=i;j++){E[k].u = i;E[k].v = j;E[k].cost = p[i].distance(p[j]);k++;}}double path = 0;for(int i = 1;i <= n;i++){ //n个顶点 father[i] = i; }sort(E,E+k);for(int i = 0;i < k;i++){int faU = findFather(E[i].u);int faV = findFather(E[i].v);if(faU != faV){father[faU] = faV;path += E[i].cost;} }printf("%.2f\n",path);}
}
这篇关于Freckles【POJ2560】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!