原题链接
Agri-Net - POJ 1258 - Virtual Judge
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
//#define int long long
int f[100100],n;
int tt=0;
struct node
{
int x,y,z;
}e[100100];
bool cmp(node q,node p)
{
return q.z<p.z;
}
void init()
{
for(int i=1;i<=n;i++) f[i]=i;
}
int find(int x)
{
if(f[x]==x) return f[x];
else return f[x]=find(f[x]);
}
int merge(int a,int b)
{
int t1=find(a);
int t2=find(b);
if(t1!=t2)
{
f[t1]=t2;
return 1;
}
return 0;
}
void kruskal()
{
int cout=0,ans=0;
for(int i=1;i<=tt;i++)
{
if(merge(e[i].x,e[i].y)&&e[i].z)
{
ans+=e[i].z;
cout++;
}
if(cout==n-1) break;
}
printf("%d\n",ans);
}
signed main()
{
while(~scanf("%d",&n)&&n)
{
tt=0;
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
int q;
scanf("%d",&q);
e[++tt].x=i;
e[tt].y=j;
e[tt].z=q;
}
}
sort(e+1,e+1+tt,cmp);
// for(int i=1;i<=tt;i++)
// printf("%d %d %d\n",e[i].x,e[i].y,e[i].z);
kruskal();
}
return 0;
}