Leetcode題解 DFS 拓撲排序

2021-10-09 07:49:12 字數 2005 閱讀 1230

深度優先搜尋: 

# 儲存有向圖

edges = collections.defaultdict(list)

# 標記每個節點的狀態:0=未搜尋,1=搜尋中,2=已完成

visited = [0] * numcourses

# 用陣列來模擬棧,下標 0 為棧底,n-1 為棧頂

result = list()

# 判斷有向圖中是否有環

valid = true

for info in prerequisites:

def dfs(u: int):

nonlocal valid

# 將節點標記為「搜尋中」

visited[u] = 1

# 搜尋其相鄰節點

# 只要發現有環,立刻停止搜尋

for v in edges[u]:

# 如果「未搜尋」那麼搜尋相鄰節點

if visited[v] == 0:

dfs(v)

if not valid:

return

# 如果「搜尋中」說明找到了環

elif visited[v] == 1:

valid = false

return

# 將節點標記為「已完成」

visited[u] = 2

# 將節點入棧

# 每次挑選乙個「未搜尋」的節點,開始進行深度優先搜尋

for i in range(numcourses):

if valid and not visited[i]:

dfs(i)

if not valid:

return list()

# 如果沒有環,那麼就有拓撲排序

# 注意下標 0 為棧底,因此需要將陣列反序輸出

return result[::-1]

拓撲排序 dfs

運用dfs,對乙個有向無回圖 dag 進行拓撲排序。乙個圖的拓撲排序可看成所有頂點沿水平線排列而成的乙個序列,使得所有有向邊均從左指向右。topological sort g call dfs g to compute finishing times f v for each vertex v as...

拓撲排序 dfs

include include includeusing namespace std const int maxn 50 typedef struct nodenode typedef struct graphgraph vectorss 存放拓撲序列 bool vis maxn int find ...

拓撲排序DFS做法

1 給定乙個有向圖,在拓撲排序中可以 有很多個正確解 由若干小段的 list 組成。2 正確的單序列順序 具體到乙個list之間的元素 3 正確的全序列順序 list彼此之間的順序,可以有多個 e.g.以下圖為例,不論先從哪個點開始 dfs,例如 dfs belt 會得到乙個 belt jacket...