【最小树形图】

给定一个有向带权图G与其中的一个节点u,找出一个以u为根节点,权和最小的有向生成树,有向生成树即为树形图。

求固定根的最小树形图,由于边都是有向边所以不可以用kruskal,prim,而应该用传说中的朱刘算法!(又是中国人的算法)

首先研究下最小树形图的性质

1.  根节点必须能到达所有其他节点,否则肯定无最小树形图(dfs直接判断即可)

2.  根节点入度为0,其余节点入度都为1

3.  边权值最小


朱刘算法的主要流程如下

1.  对所有非根节点选择一条权最小的入边

2.  如果选出来的n-1条边不构成圈,则可证明选出来的边已经构成最小树形图

如果选出来的n-1条边构成圈,则需要缩圈操作,继续上述流程


设圈中的点为ne1, ne2, ……, nek,缩圈缩成的点不妨令为node,不在此圈中的点不妨统称为t

tnode的距离为min{dist[t][nei] – dpre[nei]} ; 

nodet的距离为min{dist[nei][t]}; 

这样保证了有点连入该圈的nej点时,则可以视为断开nej点与nej的前驱在环中的边。

正确性感性判断+模拟下可以说是显然的了,其实我也不会证明

下图有利于体会刘朱算法,不妨一看


代码丑不发了

不过盾哥的程序很优美!

http://blog.csdn.net/jasonzhu8/article/details/5905926

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值