虽然可以AC 但是不是最好的解法
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef struct line
{
int begin,end;
double d;
}line;
line l[10005];
double x[101],y[101];
int f[10005],t;
int cmp(const void *a,const void *b)
{
return (*(line*)a).d>(*(line*)b).d?1:-1;
}
int find(int n)
{
while(f[n]>0)
n=f[n];
return n;
}
double kruskal()
{
int i,m,n;
double re=0.0;
qsort(l,t,sizeof(line),cmp);
for(i=0;i<t;i++)
{
m=find(l[i].begin);
n=find(l[i].end);
if(m!=n)
{
f[m]=n;
re += l[i].d;
}
}
return re;
}
int main()
{
int n;
int i,k;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
scanf("%lf%lf",&x[i],&y[i]);
t=0;
for(i=0;i<n;i++)
{
for(k=i+1;k<n;k++)
{
l[t].begin=i;
l[t].end=k;
l[t].d = (sqrt)((x[k]-x[i])*(x[k]-x[i])+(y[k]-y[i])*(y[k]-y[i]));
t++;
}
}
memset(f,0,sizeof(f));
printf("%.2lf\n",kruskal());
}
return 0;
}
本文介绍了一个使用克鲁斯卡尔算法求解最小生成树的问题实现方案。该方案通过构建边的数据结构并利用并查集进行节点连接判断,最终实现对所有顶点构成的最小生成树的权重总和的计算。
104

被折叠的 条评论
为什么被折叠?



