Algorithm 无向图中最短圈长度的求法

Algorithm 无向图中最短圈长度的求法,algorithm,data-structures,graph,Algorithm,Data Structures,Graph,我尝试了以下方法: 1) DFS,跟踪DFS树中每个顶点的级别 2) 每次看到后边缘(x,y)时,我计算循环长度=级别[x]-级别[y]+1,如果它小于最短值,则保存它 有人能举一个反例来说明这种方法是错误的吗 在无向图中找到最短圈的更好方法是什么 谢谢 为什么DFS不起作用 不能使用DFS查找最短的圆。我们可以很容易地创建一个反例,其中DFS Lead只找到最长的圆。让我们看一下下图: No fancy picture for this graph yet. Every "o" is a n

我尝试了以下方法:

1) DFS,跟踪DFS树中每个顶点的级别

2) 每次看到后边缘(x,y)时,我计算循环长度=级别[x]-级别[y]+1,如果它小于最短值,则保存它

有人能举一个反例来说明这种方法是错误的吗

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

谢谢

为什么DFS不起作用 不能使用DFS查找最短的圆。我们可以很容易地创建一个反例,其中DFS Lead只找到最长的圆。让我们看一下下图:

No fancy picture for this graph yet. Every "o" is a node. o---o | | +-------o---o-------+ | | o----o----o----o----o

如你所见,我们有九个节点。如果我们从最左边的节点
A
开始,则可能会出现以下DFS级别:

我们在迭代时有两条后缘:

  • (B,A)
    ,因此我们找到了一个长度为8的圆
  • (D,A)
    ,因此我们找到了一个长度为8的圆
但是,最短的圆的长度为5。在下一张图片中,它显示为蓝色,而之前发现的一个圆圈显示为红色:

您没有看到蓝色圆圈,因为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 这张图还没有精美的图片。 每个“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 5~~~~5~~~是后边缘 | | +-------4~~~4-------+ | | 3----2----1----2----3 如果从左节点开始,我会得到以下级别:

5~~~5 ~~~ are back-edges | | +-------4~~~4-------+ | | 3----2----1----2----3 3~~~4 | | +-------2---3-------+ | | 1----2----3----4~~~~4 3~~~4 | | +-------2---3-------+ | | 1----2----3----4~~~~4 因此,您不能使用级别公式

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

假设我们有一个具有以下边的图

十四,, 42, 43, 23, 三十一

然后可以在1、4、3、1之前遍历周期1、4、2、3、1,并且由于我们正在考虑DFS,所以不会两次访问任何节点。因此,如果首先遍历1,4,2,3,1,那么1,4,3,1或4,2,3,3根本不可能被遍历。因此,使用DFS,可以而不是确保我们将始终获得最短的周期


可能的改进:BFS树应该可以很好地工作,因为它一级一级地运行,而且对于BFS树来说,从根到任何节点的距离都是固定的,无论节点的拾取顺序如何。运行时间:O(V+E),而经过修改的Floyd Warshall算法在最坏的情况下将以O(V^3)运行。

我认为这就是您要寻找的:


您从每个节点创建一个BFS,因此您的复杂性为O(V*E)

此过程应该正常工作。顺便说一下,如果图中的节点太少,你也可以用Floyd-Warshall算法(实现传递闭包矩阵)找到最小的循环,但是Floyd-Warshall算法需要O(V^3)计算时间,而DFS只需要O(V+E)@fall,我想这也行得通,直到我在达斯古塔发现一个问题,问为什么同样的方法是错误的,并要求反例;所以这肯定是不对的。下面是我发现的问题的链接(请看最后的练习4.4):对不起,我错过了DFS树。IMHO BFS树应该可以正常工作。在DFS方式中,在较短路径之前可以访问较长路径。+1,这是一个很好的示例。我只想更改“BFS修复”部分中的
后缘
项,它们不应该存在于BFS遍历中。@Leeor:BFS中称为冲突/不一致边的是什么?它们有一个特别的名字吗?我想它们应该是交叉边,后边连接到祖先,这在BFS中是不可能的。我还认为你的复杂性太悲观了。@tor让我们以你为例。为了简单起见,假设深度(p(c))>depth(a)。如果我们引入a--c和b--p(c),如果我们从根开始,我们将有以下检查顺序:p(ab);a、 b;c、 p(c);其中a、b分别为。c、 p(c)将在同一迭代中检查。一旦你从p(c)开始,你就会遇到c的后边缘(交叉边缘?已经有一段时间了)。从p(c)和c开始,到该路径上的共同祖先,即p(ab)。因此,你找到了p(ab)-a-c-p(c)-b-p(ab)。@tor我写这个算法已经快四年了,所以我不得不查找我实际上在做什么,但是的,你是对的。我删除了那个算法。顺便说一下,还有一个更简单的反例。以一个包含奇数个节点的线的图为例。将端点称为A和B。引入X和Z,并连接A-X-B和A-Z-B。最短的循环是A-X-B-Z-A,但算法可能会返回A-…-B-X/Z-A。与上面的反例基本相同。不过,所有对最短路径仍然有效。这个图怎么样?如果从1开始,我认为O(V+E)算法没有帮助。