簡體   English   中英

使用迭代堆棧方法檢測有向圖中的循環

[英]Detect cycle in a directed graph using iterative stack approach

這是我試過的:

VISITED = 1
UNVISITED = -1
VISITING = 0


def dfs(g, start, num):
    
    state = {}
    for i in range(num):
        state[i] = UNVISITED
    
    
    stack = [start]
    while(stack != []):
        node = stack.pop()
        
        if(state[node] == VISITED):
            continue

        state[node] = VISITING
        
        if(node in g):
            for i in g[node]:
                stack.append(i)
                if(state[i] == VISITED):
                    return True
                
        state[node] = VISITED
 
def detect_cycle(n, edges):
        
    g = {}
    # adjacency list
    for (x, y) in edges:
        g[x] = g.get(x, []) + [y]

    for i in range(n):
        if(i in g):
            if(dfs(g, i, n) == True):
                return True   
    return False   
            
print(detect_cycle(5, [[1,4],[2,4],[3,1],[3,2]])) # outputs True (should be false)

圖形圖像:

該圖

上面的示例edges = [[1,4],[2,4],[3,1],[3,2]]不包含循環但它返回True 所以我的算法不適用於這種情況。

我正在嘗試使用着色圖檢測循環算法,但我不確定如何在不遞歸的情況下做到這一點。

我嘗試遵循但迭代的算法: Detecting a cycle in a directed graph using DFS?

如果訪問節點(灰色)遇到與另一個訪問節點的邊,則檢測到循環。 我在初始代碼中遇到的問題是無法以回溯方式設置節點 VISITED(黑色)。 新代碼現在有 ENTER = 0 和 EXIT = 1。Enter = 0 意味着它是我第一次訪問該節點,我將它設置為灰色(訪問)我第二次訪問節點出口將是 1,所以我可以設置它變黑(完全訪問)。

WHITE = 0
GRAY = 1
BLACK = 2

ENTER = 0
EXIT = 1


def dfs(graph, start, n):
    
    state = {}
    for i in range(n):
        state[i] = WHITE

    stack = [(start, ENTER)]
    while(stack != []):
        node, pos = stack.pop()
        
        if(pos == EXIT):
            state[node] = BLACK
            continue
        
        state[node] = GRAY
        stack.append((node, EXIT))
        
        if(node in graph):
            for v in graph[node]:
                if state[v] == GRAY:
                    return True
                elif(state[v] == WHITE):
                    stack.append((v, ENTER))
    return False
  
def detect_cycle(n, edges):
        
    g = {}
    for (x, y) in edges:
        g[x] = g.get(x, []) + [y]

    for i in range(n):
        
        if(i in g):
            if(dfs(g, i, n) == True):
                return True
            
    return False

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM