恩,最小生成树。
用的克鲁斯卡的算法,善用并查集。
#include<stdio.h>
#include<iostream>
#include<memory.h>
#include<algorithm>
using namespace std;
const int MAX_N =101;
struct node
{
int s,t,d;
}R[MAX_N*MAX_N];
int N;
int M;
int ans=0;
int T[MAX_N];
int cmp(const node a,const node b)
{
if (a.d<b.d) return 1;
else return 0;
}
int init()
{
scanf("%d",&N);
M=0;
int i,j;
for (i=1;i<=N;i++)
for (j=1;j<=N;j++)
{
M++;
scanf("%d",&R[M].d);
R[M].s=i;
R[M].t=j;
if(!R[M].d) M--;
}
sort(R+1,R+M+1,cmp);
memset(T,-1,sizeof(T));
}
int findR(int t)
{
if (T[t]==-1) return t;
else return T[t]=findR(T[t]);
}
int work()
{
int l=0;
int i=1;
while(i<=M&&l<N-1)
{
int x=findR(R[i].s);
int y=findR(R[i].t);
if(x!=y)
{
l++;
ans+=R[i].d;
T[x]=y;
}
i++;
}
}
int put()
{
printf("%d",ans);
}
int main()
{
init();
work();
put();
return 0;
}