【问题标题】:Count the number of Euler PATHs in directed graph?计算有向图中的欧拉路径的数量?
【发布时间】:2016-01-30 05:25:30
【问题描述】:
  • 我想在有向图中计算所有 Euler PATH。
  • 电路对我不好,只有路径。

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

我已经研究过这个主题,但我只能在有向和无向图中找到欧拉电路的证明(对于 NP 完全或多项式)和算法。但同样,我在有向图中寻找欧拉路径。

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

总结一下:

  1. 欧拉路径
  2. 有向图表。
  3. 只有两个节点。
  4. 高边沿计数。
  5. 边缘成本相同。

这是一张图片来说明可能的设置。

【问题讨论】:

  • 这个问题可能更适合Computer Science Stack Exchange
  • 谢谢,我也在那里问过这个问题。哪里更受关注,我会保留,明天再删除。

标签: c++ algorithm graph


【解决方案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)* - 表示 0 次或多次重复边 1-1。

现在算法看起来很明显:

  1. 生成 (1-0) 条边的排列
  2. 生成 (0-1) 条边的排列
  3. 生成 (0-0) 条边的排列
  4. 生成 (1-1) 条边的排列
  5. 在不超过 S1 和 S2 的部分中查找 S3 和 S4 的所有组成。
  6. 写下答案。

步骤 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)

【讨论】:

    猜你喜欢
    • 2017-08-27
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 2011-07-30
    • 2018-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多