给定一个有向带权图G与其中的一个节点u,找出一个以u为根节点,权和最小的有向生成树,有向生成树即为树形图。
求固定根的最小树形图,由于边都是有向边所以不可以用kruskal,prim,而应该用传说中的朱刘算法!(又是中国人的算法)
首先研究下最小树形图的性质
1. 根节点必须能到达所有其他节点,否则肯定无最小树形图(dfs直接判断即可)
2. 根节点入度为0,其余节点入度都为1
3. 边权值最小
朱刘算法的主要流程如下
1. 对所有非根节点选择一条权最小的入边
2. 如果选出来的n-1条边不构成圈,则可证明选出来的边已经构成最小树形图
如果选出来的n-1条边构成圈,则需要缩圈操作,继续上述流程
设圈中的点为ne1, ne2, ……, nek,缩圈缩成的点不妨令为node,不在此圈中的点不妨统称为t
t到node的距离为min{dist[t][nei] – dpre[nei]} ;
node到t的距离为min{dist[nei][t]};
这样保证了有点连入该圈的nej点时,则可以视为断开nej点与nej的前驱在环中的边。
正确性感性判断+模拟下可以说是显然的了,其实我也不会证明
下图有利于体会刘朱算法,不妨一看
代码丑不发了
不过盾哥的程序很优美!