Floyd在有向图上的循环检测算法

时间:2016-08-10 18:31:15

标签: algorithm graph

Floyd的循环检测算法如何用于计算有向图中的循环长度? 我遇到的大多数链接都解释了链接列表中的Flyod循环算法,但是如何将相同的算法用于有向图?

1 个答案:

答案 0 :(得分:0)

当两个指针到达时,此时指针a走了k步,指针b走了2k步,所以循环的长度除以k。因此,可以通过将指针a移动到节点x并逐步推进指针直到它们再次相遇来找到属于循环的第一个节点。

a = x;
while (a != b) {
a = succ(a);
b = succ(b);
}
first = a;

在此之后,循环的长度可以计算如下:

b = succ(a);
length = 1;
while (a != b) {
b = succ(b);
length++;
}

参考:“竞赛编程指南:通过竞赛学习和改进算法 Antti Laaksonen 的教科书”