题意
给出一个n个点邻接矩阵,问怎样花费最少的构造一个连通图。
版子
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
struct edge{int x,y,z;}a[101000];
int fa[101000];
int n,tot=0,ans;
bool cmp(edge p,edge q){return p.z<q.z;}
int getfa(int x){return fa[x]==x?fa[x]:fa[x]=getfa(fa[x]);}
void kruskal()
{
int cnt=0;
sort(a,a+tot,cmp);
for (int i=0;i<tot && cnt<n-1;i++)
{
int pp=getfa(a[i].x),qq=getfa(a[i].y);
if (pp!=qq)
{
fa[pp]=qq;
ans+=a[i].z;
cnt++;
}
}
}
int main()
{
cin>>n;
for (int i=1;i<=n;i++) fa[i]=i;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
int cur;
cin>>cur;
if (!cur) continue;
a[tot].x=i;a[tot].y=j;a[tot++].z=cur;
}
kruskal();
cout<<ans<<endl;
return 0;
}