您的博客名

— 副标题或一句话描述

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;
}

posted @ 2025-02-08 09:15  yzyUUU  阅读(67)  评论(0)    收藏  举报