最小树形图(朱刘算法)

定义:一个有向图,存在从某个点为根的,可以到达所有点的一个最小生成树,则它就是最小树形图。

对于没有给定根,我们可以新建一个点,然后让它向所有点都连一条权值为所有边权和的(或者自己定义一个inf)边,然后把该点定为根。这样找到最小树形图一定包含且只包含一条新边,减掉这条边的权值就可以了。

算法流程:
(0,先除去自环)
1,选入边集——找到除root点之外,每一个点的所有入边中权值最小的,用数组in[]记录下这个最小权值,用pre[]记录到达该点的前驱;(若图中存在独立点,最小树形图是不存在的,所以在该步骤结束后,要判断一下)
2,找有向环,并用数组id[]记录节点所属环的编号。
3,找到环后,缩点,并更新权值。
更新具体为:
ans+=in[x]
假设某点u在该环上,并设这个环中指向u的边权是in[u],那么对于每条从u出发的边(u, i, w),在新图中连接(new, i, w)的边,其中new为新加的人工顶点; 对于每条进入u的边(i, u, w),在新图中建立边(i, new, w-in[u])的边。这样,当i到new的边被选时由于ans已经加过in[u]现在再加上w-in[u]等价于只加了w,也就是删除了之前加的边,保证是树形图。

4,以环数为下一次查找的点数,继续执行上述操作,直到没有环(没有环显然就是最小树形图了)或者 判定出不存在最小树形图为止。

复杂度是O(VE)

你可能感兴趣的:(朱刘算法)