计算有向图中Euler PATH的数量?

时间:2016-01-30 05:25:31

标签: c++ algorithm graph

  • 我想在有向图中计算所有Euler PATH。
  • 电路对我不利,只有路径。

我正在做一个问题,我已经找到了一个点,在那里快速了解路径的数量会有所帮助。 目前,我已经编写了一个递归函数(在c ++中),它可以找到所有这些函数,但它的复杂性增长很快,所以我的算法变得很慢。我的算法是~O(2 ^ n)。如果可能的话,我想要一个更快的。

我已经研究了这个主题,但我只能在有向和无向图中找到Euler Circuits的证明(对于NP完全或多项式)和算法。但同样,我正在寻找有向图中的Euler Paths。

我的图表只有两个节点,但是很多边缘应该只触摸一次,就像在欧拉路径中一样。

总结如下:

  1. Euler 路径
  2. 定向图表。
  3. 只有两个节点。
  4. 高边数。
  5. 边缘成本相同。
  6. 这是一张图片,用于说明可能的设置。

    enter image description here

1 个答案:

答案 0 :(得分:1)

如果你想生成所有可能的补丁,我认为不可能加快速度,因为你必须打印很多补丁。但是如果你只需要计算它们,你可以更快地完成它。

你有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)* - 表示重复边1-1的0次或更多次。

现在算法显而易见:

  1. 生成(1-0)边缘的排列
  2. 生成(0-1)边的排列
  3. 生成(0-0)边的排列
  4. 生成(1-1)边缘的排列
  5. 查找S3和S4的所有成分,不超过S1和S2部分。
  6. 写下答案。
  7. 步骤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)