就是一个最小生成树模板
我使用的是并查集来建立最小生成树
按距离排序之后就使用并查集判断是否填入此边
具体看代码
#include<bits/stdc++.h>
using namespace std;
struct oppo{
int from,to,s;
}rood[100000];//存边
int tot;//记录边的个数
bool rule(oppo a,oppo b)
{
return a.s<b.s;
}
int n;//农场的个数
int x;//en。。。 输入用
int fa[105];//并查集
int ans;
int find(int x)//并查集
{
return fa[x]==x?x:fa[x]=find(fa[x]);//返回和路径压缩
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&x);
if(i>j)//防止重复建边,i到j相当于j到i
{
rood[++tot].from=i;
rood[tot].to=j;
rood[tot].s=x;
}
}
sort(rood+1,rood+tot+1,rule);//c++ 的快乐库函数
for(int i=1;i<=n;i++)//初始化并查集
fa[i]=i;
for(int i=1;i<=tot;i++)
{
int a=find(rood[i].from);
int b=find(rood[i].to);
if(a!=b)
{
ans+=rood[i].s;
fa[a]=b;
}
}
cout<<ans<<endl;
return 0;
}