正常的kruskal算法如下:
对应的步骤为(数字对应上图步骤):
1、初始化生成树的边集A为空集
2、对集合中的每一个顶点,都将它的集合初始化为自身
4、将边按权值进行排序
5、对排序好后的边从小到大进行判断,如果这条边所连的2个顶点不在同一个集合中,则将这条边加入到生成树的边集A中,并将此边所连的两个顶点u和v的集合做一个Union操作,如此循环加到生成树中的边集数量为n-1时停止
现在利用Tarjan算法对其进行改进:
Tarjan算法是用来求一个图中的桥的,其只需要做一次DFS(时间复杂度为O(V+E)),就可以找到一个图中所有的桥
假设图的顶点数为v,边数为e
在正常的kruskal算法中,其采用的是增边策略,即每次增加权值最小的且不构成环的边,一直增加到边数为v-1为止,正常策略就是将边进行排序,每次选一条最小的边,利用并查集判断这条边是否会构成环,如果不构成,则加入到生成树的边中,如此往复直到边数为v-1
那么我们同样可以采取删边策略,每次从图中删去一条权值最大的非桥的边,一直删到边树为v-1,那么所剩下的边即为最小生成树,由于Tarjan算法的存在,使得判