学并查集的时候写的。将所有距离储存在结构体中,然后按距离从小到大排序,遍历,如果a和b不在一个集合中,把这个距离加到答案上,然后把a和b所在的集合合并。
当然,时间复杂度是N的平方,幸好N不是很大。(其实也可以优化,我懒得去写而已)。不过好像别人都是用prim和kruskal写的。(告诉你们吧,我还没学)
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int fa[101],n;
struct node
{
int a,b,num;
}p[10001];
int find_(int a)
{
if(a!=fa[a])
fa[a]=find_(fa[a]);
return fa[a];
}
void union_(int a,int b)
{
int pa=find_(a);
int pb=find_(b);
if(pa==pb)
return ;
fa[pb]=pa;
}
int cmp1(node a,node b)
{
return a.num<b.num;
}
int main()
{
int i,j,ans,js;
while(scanf("%d",&n)!=EOF)
{
ans=js=0;
for(i=1;i<=n;i++)
fa[i]=i;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&p[++js].num);
p[js].a=i,p[js].b=j;
}
}
sort(p+1,p+js+1,cmp1);
for(i=1;i<=js;i++)
{
if(find_(p[i].a)!=find_(p[i].b))
{
ans+=p[i].num;
union_(p[i].a,p[i].b);
}
}
printf("%d\n",ans);
}
return 0;
}