Kruskal算法

86 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

简介

该算法利用贪心的思想选择当前权值最小的一条边,作为最小生成树的一部分,并利用并查集来判断当前的选择是否会导致“环”的出现。

代码流程

首先需要用结构体储存一条边的两个端点的编号及其权值,同时我们需要用优先队列按边的权值大小排序储存每一条边。

struct node{
	int x,y;//边的两个端点的编号
	int t;//边的权值
	friend bool operator < (node a, node b)
	{
		return a.t > b.t;
	}//按照边的权值排序
};
priority_queue<node>q;

然后,需要开始生成最小生成树。 我们需要找到当前权值最小的一条边,作为最小生成树的一部分,但如果当前的边加入后会形成环的话,就要舍弃这条边,判断是否有环就交给并查集好了。只需要加入n-1条边,最小生成树就完成了。

	int ans = 0;//表示最小生成树中所有边的权值
	int cnt = 0;//记录加了的边的条数
	while(cnt < n-1)
	{
		if(!q.empty())
		now = q.top();//始终选择最顶上的边
		else
		break;
		if(find(now.x) != find(now.y))//判断选择的边是否构成环
		{
			f[find(now.x)] = find(now.y);//将端点纳入同一个集合,表示他们之间可以互通
			ans += now.t;
			cnt++;//选择的边的数量++;
		}
		q.pop();
	}