圖的深度優先演算法以及廣度優先演算法
阿新 • • 發佈:2021-01-27
def dfs(isConnected):
# 獲取當前節點的鄰居節點
def _get_first_neighbor(isConnected, cur_point):
j = len(isConnected) - 1
neighbor = []
while j >= 0:
if isConnected[cur_point][j] == 1 and cur_point != j:
neighbor.append(j)
j -= 1
return neighbor
result = ''
# 儲存鄰居節點
neighbor_stack = []
# 儲存節點的訪問狀態,預設都是未被訪問狀態
is_visited = [False] * len(isConnected)
for cur_point in range(len(isConnected)):
# 如果當前節點已經被訪問,則對下一個節點進行訪問
if is_visited[cur_point]:
continue
# 當前節點置為已被訪問狀態
is_visited[cur_point] = True
result = result + str(cur_point) + '------>'
# 當前節點的所有鄰居節點壓入棧中
neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point))
# 如果鄰居節點為空,說明當前已經是最後的一個節點,否則依次對靈雎節點進行處理
while neighbor_stack.__len__() != 0:
# 獲取鄰居節點
pop = neighbor_stack.pop()
# 如果鄰居節點已經被訪問,則繼續處理下一個鄰居節點
if is_visited[pop]:
continue
else:
# 對鄰居節點進行遍歷
result = result + str(pop) + '------>'
# 修改鄰居節點的訪問狀態為已訪問
is_visited[pop] = True
# 獲取鄰居節點的鄰居節點
neighbor_stack.extend(_get_first_neighbor(isConnected, pop))
return result
def bfs(isConnected):
# 獲取當前節點的鄰居節點
def _get_first_neighbor(isConnected, cur_point):
j = 0
neighbor = []
while j < len(isConnected):
if isConnected[cur_point][j] == 1 and cur_point != j:
neighbor.append(j)
j += 1
return neighbor
result = ''
# 儲存鄰居節點
neighbor_stack = []
# 儲存節點的訪問狀態,預設都是未被訪問狀態
is_visited = [False] * len(isConnected)
for cur_point in range(len(isConnected)):
# 如果當前節點已經被訪問,則對下一個節點進行訪問
if is_visited[cur_point]:
continue
# 當前節點置為已被訪問狀態
is_visited[cur_point] = True
result = result + str(cur_point) + '------>'
# 當前節點的所有鄰居節點壓入棧中
neighbor_stack.extend(_get_first_neighbor(isConnected, cur_point))
# 如果鄰居節點為空,說明當前已經是最後的一個節點,否則依次對靈雎節點進行處理
while neighbor_stack.__len__() != 0:
# 獲取鄰居節點
pop = neighbor_stack.pop(0)
# 如果鄰居節點已經被訪問,則繼續處理下一個鄰居節點
if is_visited[pop]:
continue
else:
# 對鄰居節點進行遍歷
result = result + str(pop) + '------>'
# 修改鄰居節點的訪問狀態為已訪問
is_visited[pop] = True
# 獲取鄰居節點的鄰居節點
neighbor_stack.extend(_get_first_neighbor(isConnected, pop))
return result
測試
isConnected = [
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
[1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0], # 1
[1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 2
[0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], # 3
[0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0], # 4
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0], # 5
[0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0], # 6
[0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0], # 7
[1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0], # 8
[0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0], # 9
[0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 1], # 10
[0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0], # 11
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0], # 12
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0], # 13
[0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0], # 14
[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1] # 15
]
print("dfs結果:" + dfs(isConnected))
print("dfs結果:" + bfs(isConnected))