#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int parent[5000],n,ans;
structnode
{
int from,to,weight;
}grid[5000];
bool com_greater(node vex1 ,node vex2)
{
return vex1.weight<vex2.weight;
}
int FindR(int v)
{
int t=v;
while (parent[t]>-1)
t=parent[t];
return t;
}
void kruscal(int k)
{
ans=0;
int i,vex1,vex2,num;
for (i=1;i<=k;i++)
parent[i]=-1;
for (num=1,i=1;i<=k;i++)
{
vex1=FindR(grid[i].from);
vex2=FindR(grid[i].to);
if(vex1!=vex2)
{
ans+=grid[i].weight;
parent[vex2]=vex1;
if(num++==n)
return ;
}
}
}
int main()
{
int i,j,k,a;
while (scanf("%d",&n)!=EOF)
{
k=1;
memset(grid,0,sizeof(grid));
for (i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&a);
if(j>i)
{
grid[k].from=i;
grid[k].to=j;
grid[k++].weight=a;
}
}
sort(grid+1,grid+k,com_greater);
kruscal(k-1);
printf("%d\n",ans);
}
return 0;
}
转载于:https://www.cnblogs.com/You-Change/p/3486215.html