我尝试了以下内容:
1)DFS,跟踪DFS树中每个顶点的水平
2)每次看到后边缘(x,y)时,我计算周期长度=水平[x] - 水平[y] + 1,如果它小于最短
则保存有人可以告诉一个反例,说明这种做法是错误的吗?
在无向图中找到最短周期的更好方法是什么?
感谢。
答案 0 :(得分:22)
您无法使用DFS查找最短的圆圈。我们可以轻松创建一个反例,其中DFS引导只找到最长的圆。让我们看看下面的图表:
如您所见,我们有九个节点。如果我们从最左边的节点A
开始,则可以使用以下DFS级别:
迭代时我们有两个后边缘:
(B , A)
,因此我们找到了一个长度为8 (D , A)
,因此我们找到了一个长度为8 但是,最短的圆圈长度为5.在下一张图片中显示为蓝色,而之前找到的圆圈之一显示为红色:
您没有看到蓝色圆圈,因为您的DFS路径不包含它。 Dagupa等人在他们的书中也提到了这种行为:
但这也意味着DFS最终会将一条漫长而复杂的路线带到一个实际非常接近的顶点。
嗯,这不完全正确,可以使用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)。