最小树形图

最小树形图是在一个有向图中,找到一颗有向树使得边权和最小。

首先问题是为什么不能直接用kruskal或prim来做。考虑这个例子:

1

由于\(1\to 3,1\to 2\)的边权是一样的,所以都有可能被第一次选到,而如果选了\(1\to 3\),那么很明显是错误的。但是如果是无向图就不会有这个问题。

所以对于有向图最小生成树,即最小树形图,我们可以使用\(O(VE)\)的朱刘算法,是由朱永津和刘振宏在1965年提出的。

首先,很显然的是,如果图不连通,那么最小树形图是不存在的,否则一定是存在的。

接下来考虑如何求最小树形图。算法步骤如下:

  • dfs找出当前图中每个点的最小入边\(in[v]\)
  • 如果当前的所有最小入边不构成环,那么这就是当前图的最小树形图,答案累加所有边权并返回。
  • 否则先把答案累加环中的边权,再进行缩环。
    • 把环缩成一个点,设这个点为\(k\),那么原来环中点到\(v\)的出边,其中边权最小为\(w\),那么新边为\((k,v,w)\)
    • 对于环中点的入边\((u,v,w)\),新边为\((u,k,min(w-in[v]))\)
  • 重复上面的步骤

其中缩环的第二种情况的意义是,下一次求出到这个环中的边时,可以把对应的那条之前环中的边断掉。

转载于:https://www.cnblogs.com/owenyu/p/6724580.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值