传送门:POJ1258
最小生成树裸题,以后也可以当Kruskal算法的模板了。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int f[100];
int getf(int k)
{
return k==f[k]?k:f[k]=getf(f[k]);
}
struct node{
int u,v,w;
}q[10005];
bool cmp(node a,node b)
{
return a.w<b.w;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
//vector<int>v[105];
int cnt=0;
for(int i=1;i<=n;i++)
{
int t;
for(int j=1;j<=n;j++)
{
scanf("%d",&t);
q[cnt].u=i;
q[cnt].v=j;
q[cnt++].w=t;
}
f[i]=i;
}
sort(q,q+cnt,cmp);
int i=-1,t=1,ans=0;
int x,y;
while(t<n)//kruskal
{
i++;
x=getf(q[i].u);
y=getf(q[i].v);
if(x==y)
continue;
f[y]=x;
ans+=q[i].w;
//printf("%d ",q[i].w);
t++;
}
printf("%d\n",ans);
}
return 0;
}