查找有向和无向图中的所有循环

时间:2016-10-17 20:09:31

标签: python graph graph-theory depth-first-search

我希望能够在有向图和无向图中找到所有周期。

如果在有向图中存在或不存在循环,则下面的代码返回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] }

如何使用这些来查找有向图和无向图中存在的所有周期?

1 个答案:

答案 0 :(得分:0)

如果我理解得很好,你的问题是对定向和无向图使用一种独特的算法。

为什么不能使用算法检查无向图上的有向循环? 非有向图是有向图的特例。您可以考虑从一个前向和后向边缘构成一个无向边。

但是,这不是很有效率。通常,您的问题陈述将指示图表是否定向。