例题:
使用最小优先队列将边的权值进队;然后依次出队列。
并且用一个一维数据记录节点的父节点,出队列的同时判断两个点的父节点是否相同,同则不用,不同则可以用。判断是不是树的时候,可以根据根节点判断,因为每个节点中存储的父节点都会间接指向根节点。
Kruskal算法
Kruskal算法也是采用贪心算法的思想,运行时间为O(nlogn)。
算法描述
设R是有n个顶点的对称连通关系。S={e1,e2,e3…..ek}是R的加权边集合。
1)在S中选择最小权的边e1,设E = {e1} 用S- {e1}取代S。
2)在S中选最小权的边ei,并且不与E中的元素形成回路。用E∪{ei}代替E,并用S- {ei}取代S。
3)重复步骤知道|E|=n-1.
代码设计
1、利用优先级队列将权值小的边放到队列最前,优先出对,保证了每次选择的都是权值最小的边。
2、利用并查集的查找及结合把同处同一连通分量中的顶点连到同一父节点下。这样,每次判断是否构成回路,只要判断父节点是否相同的即可。
并查集
我们可以把每个连通分量看成一个集合,该集合包含了连通分量的所