我有一个循环加权有向图,目标是去除路径中存在的循环。
例如:路径如下,
from | to | weight
------------------
a -> b | 0.5
a -> c | 0.5
c -> e | 1
b -> d | 1
d -> a | 0.25
d -> f | 0.75
图中的循环由路径d - >引入。一个。任何人都可以建议一个算法去除周期d - > a通过调整其他节点的权重。得到的非循环图在将权重传递给末端节点e,f。
方面是等效的谢谢, 的Vivek
答案 0 :(得分:4)
Sleator-Tarjan将此称为非循环流问题,并在first paper on dynamic trees的第389页描述O(m log n)-time解决方案。如果您不需要最快的算法,请重复使用深度优先搜索来查找一个流程周期,然后反向发送取消一个或多个弧的最小流量。
在你的图表上:
a -> b | 0.5
a -> c | 0.5
c -> e | 1
b -> d | 1
d -> a | 0.25
d -> f | 0.75
DFS找到一个周期a -0.5> b -1> d -0.25> a
。在同一周期发送-0.25
。
a -> b | 0.5 - 0.25 = 0.25
a -> c | 0.5
c -> e | 1
b -> d | 1 - 0.25 = 0.75
d -> f | 0.75
我们删除
d -> a | 0.25 - 0.25 = 0
流量是非循环的,所以我们停止了。
答案 1 :(得分:2)
从你的评论到大卫的答案以及图表的权重,我认为权重是从一个节点移动到另一个节点的概率(或从一个节点移动到另一个节点的单位的百分比,无论哪种方式数学是一样的)。如果是这样,可以将其建模为Markov chain,更具体地说,建模为absorbing Markov chain。但首先,我们需要添加两条路径来适应形式定义:
e -> e | 1.0
f -> f | 1.0
我不确定您是否需要与此类似的多个图形的通用算法,否则这是您需要解决的唯一图形。我将概述这个特定图形所涉及的数学,并希望您可以在需要时将其推广到算法中。
算法非常麻烦,请按照absorbing Markov chain链接进行操作。
首先,在处理马尔可夫链时,我们需要邻接矩阵,通常称为状态转移矩阵:
| a b c d | e f
--+-----------------------+------------
a | 0 0.5 0.5 0 | 0 0
b | 0 0 0 1 | 0 0
c | 0 0 0 0 | 1 0
d | 0.25 0 0 0 | 0 0.75
--+-----------------------+------------
e | 0 0 0 0 | 1 0
f | 0 0 0 0 | 0 1
矩阵的左上部分是瞬态(非结束)状态之间的转换(由 Q 表示),右下角是吸收状态。右上角将由 R 表示。
基本矩阵,计算为 N =( I - Q ) -1 。而吸收概率(即给定无限时间,将在每个吸收状态中结束的百分比)给出为 B = NR 。使用我最好的ASCII矩阵,该图的数字是:
+- -+ +- -+
| 8 4 4 4 | | 4 3 |
| 2 8 1 8 | | 1 6 |
N = (1/7)| 0 0 7 0 | B = (1/7)| 7 0 |
| 2 1 1 8 | | 1 6 |
+- -+ +- -+
读取 B 矩阵的顶行,从状态a开始,有一个4/7(约0.5714)结束状态e的机会,和3/7(约0.4286)结束状态f的机会。您可以忽略其他三行,因为这些是在状态b,c和d中启动时的概率。
因此,如果你想要一个等效图,其中结束状态e和f的最终机会是相同的,但没有循环,你可以删除d - >路径,并使用以下权重:
a -> b | 0.4286
a -> c | 0.5714