找出无向图中最短周期的长度

时间:2013-12-30 20:59:02

标签: algorithm data-structures graph

我尝试了以下内容:

1)DFS,跟踪DFS树中每个顶点的水平

2)每次看到后边缘(x,y)时,我计算周期长度=水平[x] - 水平[y] + 1,如果它小于最短

则保存

有人可以告诉一个反例,说明这种做法是错误的吗?

在无向图中找到最短周期的更好方法是什么?

感谢。

3 个答案:

答案 0 :(得分:22)

为什么DFS不起作用

您无法使用DFS查找最短的圆圈。我们可以轻松创建一个反例,其中DFS引导只找到最长的圆。让我们看看下面的图表:

A graph with a "long line"

如您所见,我们有九个节点。如果我们从最左边的节点A开始,则可以使用以下DFS级别:

Resulting depth first search tree

迭代时我们有两个后边缘:

  • (B , A),因此我们找到了一个长度为8
  • 的圆圈
  • (D , A),因此我们找到了一个长度为8
  • 的圆圈

但是,最短的圆圈长度为5.在下一张图片中显示为蓝色,而之前找到的圆圈之一显示为红色:

Long circle vs. short circle

您没有看到蓝色圆圈,因为您的DFS路径不包含它。 Dagupa等人在他们的书中也提到了这种行为:

  

但这也意味着DFS最终会将一条漫长而复杂的路线带到一个实际非常接近的顶点。

为什么BFS不起作用

嗯,这不完全正确,可以使用BFS(参见下一小节),但是你不能使用你的公式。请看下面的图表:

No fancy picture for this graph yet.

Every "o" is a node.

        o---o
        |   |
+-------o---o-------+
|                   |
o----o----o----o----o

让我们看看BFS可能达到的水平。如果我从中间的节点开始,我会得到以下级别:

        5~~~5            ~~~ are back-edges
        |   |
+-------4~~~4-------+
|                   |
3----2----1----2----3

如果我从左侧节点开始,我会得到以下级别:

        3~~~4
        |   |
+-------2---3-------+
|                   |
1----2----3----4~~~~4

因此,您无法使用等级公式。

解决方案

虽然效率不高,但使用全对最短路径算法并检查每个节点的距离(i,i)是一种有效的解决方案。

答案 1 :(得分:2)

我认为这正是您所寻找的:http://webcourse.cs.technion.ac.il/234247/Winter2003-2004/ho/WCFiles/Girth.pdf

您从每个节点创建BFS,因此您具有复杂度O(V * E)

答案 2 :(得分:0)

假设我们的图表有以下边缘,

1·; - →4, 4℃; - →2, 4℃; - →3, 2'; - →3, 3'; - →1

然后可以在1,4,3,1之前遍历第1,4,2,3,1循环,并且当我们考虑DFS时,将不会访问节点两次。因此,如果首先遍历1,4,2,3,1,则根本不会遍历1,4,3,1或4,2,3,3。因此,对于DFS,它可以 NOT 确保我们将始终获得最短的周期。

可能的改进: BFS树应该可以正常工作,并且从根到任何节点的BFS树距离都是固定的,无论选择哪个节点节点。运行时:O(V + E),而修改后的Floyd-Warshall算法在最坏的情况下运行在O(V ^ 3)。