最小树形图
问题引入
在带权无向图中,最小生成树是一个广为人知的问题。对应的,在有向图中,我们也可以定义有向生成树(Directed Spanning Trees,简称 DST)。在有向图
需要注意的是,并非图
类比最小生成树,最小树形图就是带权有向图
这导致对于无向图的算法(Kruskal 算法、Prim 算法等等)都无法在有向图上算出最小树形图。
1965 年,朱永津和刘振宏 [1] 最先提出了最小树形图时间复杂度为
算法流程
首先,DST 有一个特点:除根节点外,其它节点的入度为
当然现实没有那么美好,很大概率下,这样选择会出现环。现在来考虑其中的一个简单环
考虑任意一棵 MDST,设其树根为
换句话说,我们可以只用考虑删去环
- 如果
$u,\ v \notin C$ ,即环外一条边,该边保持不变。 - 如果
$u,\ v \in C$ ,即内接在环上的一条边,将这条边删去。 - 如果
$u \in C$ 而$v \notin C$ ,相当于从环$C$ 出发的边,则将$u$ 改为$c$ 。 - 否则就是进入环
$C$ 的边,此时将$v$ 改为$c$ ,且边权变为$w(e) - w(\mathrm{in}(v))$ 。
在得到的新图
快速实现
我们知道,无向图中最小生成树的时间复杂度取决与排序的复杂度,即
得到这棵树之后,我们就可以从任意合法的根节点开始展开整个 MDST 了。首先对于原图中的树根 我实现了朴素的 O(VE) 算法和 Tarjan 的快速算法,用 POJ 3164 测试了下,如果细节上有问题的可以参考一下:由于有人提出我之前写的
另外,我是看的 Uri Zwick 教授 [4] 的讲稿写的算法,里面的实现部分写的比较详细。
相关问题
上面的讨论中,MDST 的树根都是给定了的。而在有些问题中,可能没有给定树根(更类似于无向图的最小生成树了)。解决这类问题并不需要进行
参考资料
[1]. Chu, Y. J.; Liu, T. H. (1965), On the Shortest Arborescence of a Directed Graph, Science Sinica, 14: 1396–1400
[2]. Edmonds, J. (1967), Optimum Branchings, J. Res. Nat. Bur. Standards, 71B: 233–240, doi:10.6028/jres.071b.032
[3]. R.E. Tarjan. (1977), Finding optimum branchings, Networks, 7:25–35
[4]. Uri Zwick. (2013), Directed Minimum Spanning Trees, Lecture notes on “Analysis of Algorithms”
[5]. H.N. Gabow, Z. Galil, T.H. Spencer, and R.E. Tarjan. (1986), Efficient algorithms for finding minimum spanning trees in undirected and directed graphs, Combinatorica, 6:109–122