Kruskal 算法入门
Kruskal 算法入门
例题
题面
有 \(n\) 个点, \(m\) 条变的图,求最小生成树权值和。
格式
第一行两个数 \(n,m\) 。
以下 \(m\) 行 , 每行三个数 \(u,v,w\) , 代表左右端点以及权值。
思路
贪心,按照边权排序,然后一条一条的加边。
我们还需要用并查集来判断左右两端点是否已经连起来了,即填上边以后是否会产生环。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int V,E,need;
struct edge{
int u,v,val;
}g[100005];
bool cmp(edge a,edge b){
return a.val<b.val;
}
int f[50004];
int find(int x){
if(f[x]==x)return x;
return f[x]=find(f[x]);
}
int cnt,ans;
signed main(){
cin>>V>>E;
for(int i=1;i<=V;i++)f[i]=i;
for(int i=1;i<=E;i++){
cin>>g[i].u>>g[i].v>>g[i].val;
}
sort(g+1,g+E+1,cmp);
for(int i=1;i<=E;i++){
int u=g[i].u,v=g[i].v,val=g[i].val;
int fu=find(u),fv=find(v);
if(fu==fv)continue;
f[fu]=fv;
ans+=val;
}
cout<<ans;
}
本文来自博客园,作者:yzyUUU,转载请注明原文链接:https://www.cnblogs.com/yangzhiyao/p/18703634

浙公网安备 33010602011771号