我希望能够在有向图和无向图中找到所有周期。
如果在有向图中存在或不存在循环,则下面的代码返回True或False:
def cycle_exists(G):
color = { u : "white" for u in G }
found_cycle = [False]
for u in G:
if color[u] == "white":
dfs_visit(G, u, color, found_cycle)
if found_cycle[0]:
break
return found_cycle[0]
def dfs_visit(G, u, color, found_cycle):
if found_cycle[0]:
return
color[u] = "gray"
for v in G[u]:
if color[v] == "gray":
found_cycle[0] = True
return
if color[v] == "white":
dfs_visit(G, v, color, found_cycle)
color[u] = "black"
如果在无向图中存在或不存在循环,则以下代码返回True或False:
def cycle_exists(G):
marked = { u : False for u in G }
found_cycle = [False]
for u in G:
if not marked[u]:
dfs_visit(G, u, found_cycle, u, marked)
if found_cycle[0]:
break
return found_cycle[0]
def dfs_visit(G, u, found_cycle, pred_node, marked):
if found_cycle[0]:
return
marked[u] = True
for v in G[u]:
if marked[v] and v != pred_node:
found_cycle[0] = True
return
if not marked[v]:
dfs_visit(G, v, found_cycle, u, marked)
graph_example = { 0 : [1],
1 : [0, 2, 3, 5],
2 : [1],
3 : [1, 4],
4 : [3, 5],
5 : [1, 4] }
如何使用这些来查找有向图和无向图中存在的所有周期?
答案 0 :(得分:0)
如果我理解得很好,你的问题是对定向和无向图使用一种独特的算法。
为什么不能使用算法检查无向图上的有向循环? 非有向图是有向图的特例。您可以考虑从一个前向和后向边缘构成一个无向边。
但是,这不是很有效率。通常,您的问题陈述将指示图表是否定向。