最小树形图(朱刘算法)

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

对于没有给定根,我们可以新建一个点,然后让它向所有点都连一条权值为所有边权和的(或者自己定义一个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)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值