廣度優先遍歷
常用的解決無權重最短路徑問題方法,其核心在於使用佇列「先進先出」的特點,能快速找到最靠近起始節點的目標節點。
問題
由於各節點順序進隊出隊,在查詢到目標節點後很難追溯最短路徑。
解決方案
參考dijkstra演算法,額外增加parents雜湊表,記錄下能使入隊節點被最早發現的父節點,即當節點入隊時候,一起更新入隊節點的父節點資訊,以方便後續路徑追溯。
**
路徑圖如下
a--1--c
6 / | |1
start |3 final
2\ | /5
b
def creat_graph():
"""字典巢狀字典實現帶權重有向路徑圖"""
graph = dict()
graph["start"] = dict()
graph["start"]['a'] = 6
graph["start"]['b'] = 2
graph["a"] = dict()
graph["a"]['c'] = 1
graph["c"] = dict()
graph["c"]['fin'] = 1
graph["b"] = dict()
graph["b"]['a'] = 3
graph["b"]['fin'] = 5
graph["fin"] = dict()
return graph
建立父節點雜湊表
def parents_table():
# 建立儲存父節點的雜湊表
parents = dict()
parents['a'] = none
parents['b'] = none
parents['c'] = none
parents['fin'] = none
return parents
bfs實現
def bfs(graph, start, end, parents):
"""廣度優先遍歷,搜尋最短路徑"""
from collections import deque # 建立搜尋佇列
search_queue = deque()
# 佇列中新增起始點,並記錄鄰居節點父節點
for node in graph[start]:
if not parents[node]:
parents[node] = 'start'
searched = # 記錄已查詢節點
while search_queue:
node = search_queue.popleft()
if node not in searched:
if node == end: # 找到目標返回父節點列表,用以追溯最終路徑
return node, parents
else:
for n in graph[node]: # 記錄達到節點的最近路徑的父節點
if not parents[n]:
parents[n] = node
return false
路徑追溯
def find_start(parents, key):
res =
while parents[key] != 'start':
key = parents[key]
res.reverse()
for i in res:
if i == 'fin':
print(i)
else:
print(i, "-->", end='')
目標:查詢從「start」–>「fin」的最短路徑
def main():
# 建立路徑圖和父節點雜湊表
graphtable = creat_graph()
parents = parents_table()
item, parentstable = bfs(graphtable, 'start', 'fin', parents)
# 最終路徑追溯
find_start(parentstable, 'fin')
if __name__ == '__main__':
main()
執行結果 bfs解決最短路問題
寬度優先搜尋按照開始狀態由遠及近的順序進行搜尋,因此很容易地用來求最短路徑 最少操作之類問題的答案。7 6 迷宮尋路 給定乙個m行n列的迷宮圖,其中 0 表示可通路,1 表示障礙物,無法通行。在迷宮中只允許在水平或上下四個方向的通路上行走,走過的位置不能重複走。5行8列的迷宮如下 0 1 1 1 0...
迷宮最短路徑問題 bfs
問題 求起點到終點的最小步數 分析 廣搜按照距開始狀態由近及遠的順序進行搜尋,因此很容易地來求最短路徑 最小操作之類問題的答案。include include include includeusing namespace std const int inf 10000000 typedef pair...
BFS 最短路徑 迷宮問題
題目 define crt secure no warnings include include include using namespace std typedef struct node st int map 5 5 dx 4 dy 4 c 0 queue q st way 50 void o...