题目链接
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);
}
}