[英]Count the number of Euler PATHs in directed graph?
我正在做一个问题,我已经得出结论,知道快速的路径数量会有所帮助。 目前,我已经编写了一个用c ++编写的递归函数,可以找到所有这些递归函数,但是它的复杂性迅速增长,因此我的算法很快变慢。 我的算法是〜O(2 ^ n)。 如果可能的话,我想要一个更快的。
我已经研究了该主题,但是我只能在有向图和无向图中找到Euler电路的证明(为NP完整或多项式)和算法。 但是,我再次在有向图中寻找欧拉路径。
我的图只有两个节点,但是有很多边,应该只接触一次,就像在欧拉路径中一样。
因此,总而言之:
这是说明可能的设置的图像。
如果您想生成所有可能的路径,我认为不可能加快速度,因为您必须打印很多路径。 但是,如果您只需要计算它们,则可以更快地完成。
您有4种类型的边。 1)0-0; 2)1-1; 3)0-1; 4)1-0
首先,让我们计算一下我们有多少个类型3和4的边。
假设:
S1-类型1的边总数
S2-类型2的边总数
S3-类型3的边总数
S4-类型4的边总数
如果| S3-S4 | > 1路径不存在。
对于您的图,S3 = 1,S4 =2。假设我们有一条路径。 让我们修复类型3和4的边。
然后该路径将如下所示:
(1-1)*, 1-0, (0-0)*, 0-1, (1-1)*, 1-0, (0-0)*
(1-1)*
-表示0或更多次重复边1-1。
现在该算法看起来很明显:
步骤1-4将花费O(S1!* S2!* S3!* S4!)时间(S1 + S2 + S3 + S4 = n)。
因此该算法将很慢。
我们可以使用乘积法则找到总数。
步骤1-4给我们S1! * S2! * S3! * S4! 组合。
可以计算O(N)时间中的第5步组合。 只需计算本文中的前缀总和即可: https : //en.wikipedia.org/wiki/Composition_(combinatorics)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.