【问题标题】:Find all possible Euler cycles找出所有可能的欧拉环
【发布时间】:2011-05-16 20:41:08
【问题描述】:

我已经实现了一种算法来为无向图中的给定起始顶点找到欧拉循环(使用 DFS 并删除访问的边),但它总是只返回一个路径。如何修改算法以搜索所有可能的欧拉环来查找顶点?

相关代码如下:

typedef int Graph[200][200]; // adjacency matrix
int v, e; // vertex count, edge count

......

void DFS(Graph &G, int x) {
    int i;
    Push(x);
    for (i = 0; i < v; i++)
        if (G[i][x] > 0) {
            G[i][x] = 0;
            G[x][i] = 0;
            DFS(G, i);
            break;
    }

}

【问题讨论】:

  • 你能发布你的实现吗?它不应该需要太多更改。
  • 你没有测试过桥梁吗?这不是欧拉回路!?或者欧拉回路和欧拉循环有区别吗?
  • 是的,暂时没有网桥检测。只是想先让它在简单的图表上工作。

标签: algorithm graph graph-theory


【解决方案1】:

递归调用后,你应该重新插入你之前删除的边缘,并摆脱中断。

void DFS(Graph &G, int x) 
{
    int i;
    Push(x);
    for (i = 0; i < v; i++)
        if (G[i][x] > 0) 
        {
            G[i][x] *= -1;
            G[x][i] *= -1;
            DFS(G, i);
            G[i][x] *= -1;
            G[x][i] *= -1;
        }

}

您现在只需要一种方法来确定您何时生成了一个完整的周期,以便您可以打印它并继续下一个。当您消除了图表的每条边时,就会发生这种情况。

【讨论】:

  • 嗯,它似乎产生了所有可能的循环,而不仅仅是欧拉循环。但无论如何它非常有帮助。从这些中选择欧拉循环非常容易,我认为这正是我在这个问题中所期望的。
【解决方案2】:

你想遍历所有顶点。

【讨论】:

  • 为什么要投反对票?这不是一个严肃的答案吗?他可以尝试所有组合吗?
  • 可以有多个循环从一个顶点开始并循环,尽管所有顶点都不能解决这个问题。顺便说一句,否决票不是我的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多