簡體   English   中英

有向圖中的循環

[英]Cycles in directed graph

我正在連接一個函數來檢查圖形是否包含一個循環。

它表示為每個節點連接到的節點的所有索引的列表。 節點從1(任務要求)枚舉。

在檢查圖[[2, 3], [], [4], []] ,程序正確進入第一個列出的節點,但在第二次迭代中,假設adjlist[node-1]是一個int值3而不是數組(或至少int = 2

我錯過了什么?

編碼:

def is_acyclic(adjlist: List, visited: List, path: List) -> bool:
    '''
    :param adjlist: list representation of a graph; eg: [[2, 3], [], [4], []]
    :param visited: visited nodes
    :param path: visited nodes in current iteration
    :return: the graph does not contain a cycle
    '''

    for node in range(1, len(adjlist)+1):
        if node not in visited:
            visited.append(node)
            path.append(node)

            for child in adjlist[node-1]:
                if child in path:
                        return False
                elif child not in visited:
                    if is_acyclic(adjlist[node-1], visited, path) is False:
                        return False

            path.remove(node)
            return True

這是因為函數是遞歸調用的。 代碼的這一部分一直在修剪圖形鄰接列表:

        elif child not in visited:
            if is_acyclic(adjlist[node-1], visited, path, level=level + 1) is False:
                return False

第一次鄰接列表是:

[[2, 3], [], [4], []]

adjlist[node-1][2, 3]

鄰接列表第二次是:

[2, 3]

adjlist[node-1]3

因為2已經被訪問過,所以節點實際上會增加到2.因此,你看到:

 adjlist[node-1] == adjlist[2-1] == adjlist[1] == 3

暫無
暫無

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

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