3 0 990 692 990 0 179 692 179 0 1 1 2
179
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node{
int a,b,c;
}s[100100];
int father[110];
int cmp(node x,node y)//求最小生成树的最小权值,要求权值和最小,故升序。
{
return x.c<y.c;
}
int find(int r)//寻找父节点
{
if(r!=father[r])
return find(father[r]);
else
return father[r];
}
int kuskal(int n,int m)
{
int i,sum=0,a,b;
sort(s,s+m,cmp);
for(i=0;i<m;i++)
{
a=s[i].a;
b=s[i].b;
a=find(a);
b=find(b);
if(a!=b)//运用的稀疏矩阵的下三角矩阵,只计算在在方形矩阵一端即可
{
sum+=s[i].c;//并入最小生成树,
father[a]=b;//父节点合并,即将该节点并入最小生成树
}
}
return sum;//返回最小生成树的最小权值和!
}
int main()
{
int n,m,i,j,q,a,b,d;
while(~scanf("%d",&n))
{
m=0;
for(i=1;i<=n;i++)
father[i]=i;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
scanf("%d",&d);
if(i>=j)//稀疏矩阵的下三角矩阵
{
continue;
}
s[m].a=i;
s[m].b=j;
s[m].c=d;
m++;//统计位于下三角矩阵的坐标点
}
}
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d%d",&a,&b);
a=find(a);
b=find(b);
father[a]=b;
}
printf("%d\n",kuskal(n,m));
}
return 0;
} hdu Constructing Roads(最小生成树,kuskal算法)
原文:http://blog.csdn.net/ice_alone/article/details/41014795