赞
踩
Kruskal算法就是按照图中各个边上的权值大小进行递增排序,以此来构造最小生成树。
在由Kruskal实现最小生成树的过程中,难以理解的就是其中的判断边与边是否形成环路的问题,本文主要对此进行一定的介绍。
首先我们要知道,在Kruskal实现最小生成树的算法中利用到了并查集的概念,这个概念搞不懂是很难理解此算法的。
在Krusal算法中,parent(判断边与边是否形成环路的数组)就像是个并查集,如果边起始顶点在树中找到的根和终点在树中找到的根是相等的,说明他们都在同一个并查集中,不能连接(树已经有顶点到这两顶点的路径了,就不需要加入了,否则就形成了环),反之则需要将该边的关系存入数组parent。
并查集(Union Find)是一种用于管理分组的数据结构。它具备两个操作:(1)查询元素a和元素b是否为同一组 (2) 将元素a和b合并为同一组。
算法思路:
假如有编号为1,2,3,…, n的n个元素,我们用一个数组node[]来存储每个元素的父节点。一开始,我们先将它们的父节点设为自己。
int node[i]; //存储每个元素的父节点 //初始化n个节点,初始时,每个元素的父节点是自己!!!!! void Init(int n){ for(int i = 0; i < n; i++){ node[i] = i; } } //查找当前元素所在树的根节点(代表元素) int find(int x){ if(x == node[x]) return x; return find(node[x]);//父节点的父节点肯定是其本身,node[x]内存储的是x的父节点!!!!! } //合并元素x, y所处的集合 void Unite(int x, int y){ //查找到x,y的根节点 x = find(x); y = find(y); if(x == y) //如果找到的两个元素的父节点是相同的就说明他们两个是在同一棵树下(并查集中),不用合并 return ; //将x的根节点与y的根节点相连 node[x] = y; }
参考文章:
https://blog.csdn.net/luomingjun12315/article/details/47373345
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。