最小生成树——Kruskal算法详解

这篇具有很好参考价值的文章主要介绍了最小生成树——Kruskal算法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.Kruskal算法解决问题:最小生成树
2.Kruskal所需要的前提知识:边集数组(引用)和 结构体
3.Kruskal算法主要思想:

Kruskal算法将 n 个点看成 n 个独立的连通分支。

首先按边权大小排序。

然后只要在 m 条边里按下表从小到大遍历选出合适的 n - 1 条(前提条件:选出的边不能成自环,否则将无法连通),就是一个最小生成树。

Q:怎么确定选出的是 合适 的?
A:聪明的 Joseph Kruskal 早就想到了这个问题,他用一个 int nodeset[] 数组来表示当前节点属于哪个“连通块”,如果要连接 A 和 B,那就需要所有属于 nodeset[A] 集合的点的 nodeset 值都变成 nodeset[B],简单来说,就是合并 A 与 B

4.Kruskal算法实现步骤:

1.初始化,将所有边都按权值从小到大排序,将每个节点的 nodeset 值都初始化为自己的编号,即 nodeset[i] = i;注意!!!要用边集数组!!!
2.按排序后的顺序选择最小的边(u, v);
3(1).如果 nodeset[u] == nodeset[v], 说明加入这条边了之后会有环,所以要舍;
3(2).如果 nodeset[u] != nodeset[v], 说明加入了这条边之后没有环,所以合并 u所在的集合 与 v所在的集合;
4.重复执行 23 直到已经加入了 n - 1 条边.
算法结束

5.Kruskal算法实现代码:

#include <iostream>
#include <algorithm> //sort头文件
using namespace std;
struct node { //边集数组
	int u, v, w;
}e[1000005];
int nodeset[1000005], n, m;
bool cmp(node a, node b) { //sort判断条件
	return a.w < b.w;
}
bool merge(int u, int v) {
	int uu = nodeset[u], vv = nodeset[v];
	if (uu == vv) {
		return false;
	}
	//uu != vv 的话就合并 uu 和 vv
	for (int i = 1; i <= n; i++) {
		if (nodeset[i] == uu) {
			nodeset[i] = vv;
		}
	}
	return true;
}
void kruskal(int n) {
	int ans = 0, cnt = 0;
	for (int i = 1; i <= m; i++) { //按顺序遍历 m 边集数组
		int from = e[i].u, to = e[i].v, value = e[i].w;
		if (merge(from, to)) { //需要合并,即3(2)
			ans += value; //答案更新
			cnt++;
			if (cnt == n - 1) { //判断时候已经选取了 n - 1 个数
				break;
			}
		}
	}
	cout << ans;
}
int main() {
	int t;
	cin >> t;
	while (t--) {
		cin >> n >> m;
		//初始化
		for (int i = 1; i <= m; i++) {
			int u, v, w;
			cin >> u >> v >> w;
			e[i].u = u;
			e[i].v = v;
			e[i].w = w;
		}
		for (int i = 1; i <= n; i++) { //初始化 nodeset[]
			nodeset[i] = i;
		}
		sort(e + 1, e + m + 1, cmp); //边集数组排序
		kruskal(n);
	}
	return 0;
} 

6.Kruskal算法时间复杂度以及空间复杂度分析:
时间复杂度:O(mlogm + n2)。
空间复杂度:O(m)。

7.Kruskal算法的要点: 理解 nodeset 数组的含义与其用法文章来源地址https://www.toymoban.com/news/detail-775870.html

到了这里,关于最小生成树——Kruskal算法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 求无向图的最小生成树——Kruskal算法(超详细)【并查集,python实现】

    以如下无向图为例,求最小生成树及其权值。 补充知识点: 最小生成树(不官方的解释):包含所有节点,保持整个图连通,所有边权值之和最小。 1、补充在前 (1)图的存储 采用二维列表存储(点,点,边的权值) (2)顶点转换 为了便于计算,将字母A ~ G用数字0 ~ 6代

    2024年02月04日
    浏览(37)
  • Kruskal 算法 最小生成树

    1.按边从小到大进行排序 2.从小到大进行加边,保证加入的边的两端点不连通,即保证不形成回路

    2024年02月10日
    浏览(32)
  • 最小生成树——Kruskal算法

    目录 基本思想 实现 伪代码 实际问题求解 最小生成树 :带权连通图的生成树中 边的权值之和最小的生成树。 最小生成树不是唯一的。当图中的各边权值互不相等时,最小生成树是唯一的; 若无向连通图本身是一棵树时(边数比顶点数少1 ),则最小生成树就是它本身。 最

    2023年04月26日
    浏览(42)
  • Kruskal算法求解最小生成树

    最小生成树是一个连通图。 什么是连通图,(强)连通图详解 前面介绍了《图存储结构》,本节继续讲解什么是 连通图 。 前面讲过,图中从一个顶点到达另一顶点,若存在至少一条路径,则称这两个顶点是连通着的。例如图 1 中,虽然 V1 和 V3 http://c.biancheng.net/view/3405.ht

    2024年02月07日
    浏览(49)
  • 最小生成树(Prim算法,Kruskal算法)

    (1)生成树: 如果在一个无向连通图不包含回路(连通图中不存在环),则为一个树 (2)最小生成树(minimal spanning tree): 在一个图所有生成树中,代价最小的生成树称为最小生成树 (3)生成树的代价: 在一个无向连通网中,生成树各边的权值之和称为该生成树的代价

    2024年02月08日
    浏览(35)
  • 859. Kruskal算法求最小生成树

    给定一个 nn 个点 mm 条边的无向图,图中可能存在重边和自环,边权可能为负数。 求最小生成树的树边权重之和,如果最小生成树不存在则输出  impossible 。 给定一张边带权的无向图 G=(V,E)G=(V,E),其中 VV 表示图中点的集合,EE 表示图中边的集合,n=|V|n=|V|,m=|E|m=|E|。 由

    2023年04月09日
    浏览(30)
  • 图的最小生成树-Kruskal算法

    目录 问题引入  程序设计  程序分析 本节文章 【问题描述】 编写程序,利用带权无向图的邻接矩阵存储,实现图的最小生成树Kruskal算法。

    2024年02月08日
    浏览(50)
  • 最小生成树—Kruskal算法和Prim算法

    连通图:在无向图中,若从顶点v1到顶点v2有路径,则称顶点v1与顶点v2是连通的。如果图中任 意一对顶点都是连通的,则称此图为连通图。 生成树:一个连通图的最小连通子图称作该图的生成树。有n个顶点的连通图的生成树有n个顶点 和n-1条边。 最小生成树:构成生成树的

    2024年02月05日
    浏览(36)
  • 最小生成树算法之Kruskal算法(c++)

    与Prim算法生成图的最小生成的树算法不同在于: Prim算法是基于图中的顶点的,且不依赖于边,Prim从顶点出发拓展,依次找每个顶点相邻的权值最小的边,直至生成最小生成树。因此,Prim算法的时间复杂度是O(v^2),适合边稠密图。 而Kruskal算法恰恰相反,是基于图中的边的一

    2024年02月12日
    浏览(33)
  • 最小生成树(Prim算法与Kruskal算法)

    一个连通图的生成树是一个极小的连通子图,它含有图中全部的n个顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树称为最小生成树。 例如下图中①、②、③都是左侧图的生成树,但③是构造连通网的最小代价,所以③是该图的最小生成树。 P

    2024年02月05日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包