gpt4 book ai didi

python - 使用 Tarjan 算法枚举图中的循环

转载 作者:太空狗 更新时间:2023-10-30 01:22:08 29 4
gpt4 key购买 nike

我正在尝试使用 Tarjan 算法确定有向图中的循环,该算法在他 1972 年 9 月的研究论文“有向图的基本电路枚举”中提出。

我正在使用 Python 编写算法代码,并使用邻接表来跟踪节点之间的关系。

Graph visualisation

所以在下面的“G”中,节点0指向节点1,节点1指向节点4,6,7……等等

G = [[1], [4, 6, 7], [4, 6, 7], [4, 6, 7], [2, 3], [2, 3], [5, 8], [5, 8], [], []]
N = len(G)

points = []
marked_stack = []
marked = [False for x in xrange(0,N)]

g = None
def tarjan(s, v, f):
global g
points.append(v)
marked_stack.append(v)
marked[v] = True

for w in G[v]:
if w < s:
G[v].pop(G[v].index(w))
elif w == s:
print points
f = True
elif marked[w] == False:
if f == g and f == False:
f = False
else:
f = True
tarjan(s, w, g)

g = f

if f == True:
u = marked_stack.pop()
while (u != v):
marked[u] = False
u = marked_stack.pop()
#v is now deleted from mark stacked, and has been called u
#unmark v
marked[u] = False
points.pop(points.index(v))

for i in xrange(0,N):
marked[i] = False

for i in xrange(0,N):
points = []
tarjan(i,i, False)
while (len(marked_stack) > 0):
u = marked_stack.pop()
marked[u] = False

Tarjan 的算法检测到以下循环:

[2, 4]

[2, 4, 3, 6, 5]

[2, 4, 3, 7, 5]

[2, 6, 5]

[2, 6, 5, 3, 4]

[2, 7, 5]

[2, 7, 5, 3, 4]

[3, 7, 5]

我还完成了 Tiernan 的算法,它(正确地)找到了 2 个额外 周期:

[3,4]

[3,6,5]

如果能帮助我找出 Tarjan 跳过这 2 个周期的原因,我将不胜感激。也许我的代码有问题?

最佳答案

在这些行中:

for w in G[v]:
if w < s:
G[v].pop(G[v].index(w))

您正在遍历列表并从中弹出元素。这会阻止迭代按预期工作。

如果您更改代码以复制列表,它会产生额外的循环:

for w in G[v][:]:

关于python - 使用 Tarjan 算法枚举图中的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25898100/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com