最小生成树:
Kraskul算法
设a[N],a2[N]数组,a[N]用于保存源节点,a2[N]用于保存父节点。
并查集用于判断是否构成回路:
int findl(int x)
{
if(x!=a2[x])
a2[x]=findl(a2[x]);
return a2[x];
}
附上代码:
#include<stdio.h>
#include<math.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=10000+10;
double a[N],b[N];
int a1[N],a2[N];
struct node
{
int x;
int y;
double l;
}text[N];
double dis(int x,int y)
{
double s;
s=sqrt((a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])*(b[x]-b[y]));
return s;
}
int comp(const int x,const int y)
{
return text[x].l<=text[y].l;
}
int findl(int x)
{
if(x!=a2[x])
a2[x]=findl(a2[x]);
return a2[x];
}
int main()
{
int i,j,k,n,m,r;
int tx,ty;
double sum;
while(scanf("%d",&n)==1)
{
sum=0.0;
for(i=0;i<N;i++)
{
a1[i]=i;
a2[i]=i;
}
for(i=0;i<n;i++)
{
scanf("%lf%lf",&a[i],&b[i]);
}
k=0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
{
text[k].l=dis(i,j);
text[k].x=i;
text[k].y=j;
k++;
}
}
}
sort(a1,a1+k,comp);
for(i=0;i<k;i++)
{
r=a1[i];
tx=findl(text[r].x);
ty=findl(text[r].y);
if(tx!=ty)
{
sum+=text[r].l;
a2[tx]=ty;
}
}
printf("%.2lf\n",sum);
}
return 0;
}