裸题意:
给你一个图,每条边有一个花费,指定一个点为根,要求选其中若干条边构成一棵合法的树,且花费最少,求最小花费。
与最小生成树的区别:最小生成树是要最大的边权最小,最小树形图是要边权和最小。
朱刘算法:
最小树形图一般用朱刘算法。
朱刘算法是由两个中国人提出,一个姓朱,一个姓刘,所以叫朱刘算法。
———————————我是分界线,下面正文———————————–
首先要认识到,这个最小花费一定不小于每个点的
k
的和(假设
如图:
边上的黑色数字是花费,点上的红色数字就是 k 啦。
所以就先贪心先选好每个点的最小花费的边,然后把这条边的花费累加到
但是这样有一个问题:可能有环。
如上图选完边之后的效果:
然而出现了两个环,没有构成一棵树,怎么办?
有环就把环缩成点咯。
缩点之后就要把原来环里面的点的连向环外的点的边重新连回去。
不过由于环内每个点已经累加一次边值了,所以要把每个点连出去的边的花费都减 k <script type="math/tex" id="MathJax-Element-15">k</script> 。
效果如图:
(红边是选了的)
然后接着每个没选边的点接着选边,接着缩点,直到没有出现环时就是一棵树。
这棵树就是最小树形图。