from collections import deque
graph =
graph[
"you"]=
["alice"
,"bob"
,"claire"
]graph[
"bob"]=
["anuj"
,"peggy"
]graph[
"alice"]=
["peggy"
]graph[
"claire"]=
["thom"
,"jonny"
]graph[
"anuj"]=
graph[
"peggy"]=
graph[
"thom"]=
graph[
"jonny"]=
#起始頂點和結束頂點
start=
'you'
end=
'thom'
distance=
0#建立佇列
search_queue = deque(
)#往佇列中加入起始頂點關聯的下一批
search_queue+=graph[start]
#print search_queue
#標記已經遍歷過的頂點
searched=
[start]
#當佇列不為空時
while search_queue:
#將佇列第一位取出
person = search_queue.popleft(
)#print person
#如果該頂點還沒有被遍歷
if person not
in searched:
#且該頂點已經到達目的
if person == end:
print searched
#該頂點已經被遍歷
else
:# 將此人關聯的其他人加入佇列
search_queue += graph[person]
#print search_queue
輸出
['you', 'alice', 'bob', 'claire', 'peggy', 'anuj', 'thom']
但是這個只能得到頂點的遍歷順序(輸出searched陣列即可)。如果我們想將start=『you』,
end='thom』這兩個頂點間的路徑和路徑長度求出來,單單上面的**是不夠的。
#列印最短路徑l=[
]endd=
'thom'
l=[endd]
#沒有找到其實頂點you
while endd !=
'you'
:#遍歷searched的頂點
for i in searched:
#如果找到endd的父親
if endd in graph[i]
:#將父親加入到陣列
#令endd=父親頂點(繼續找父親的父親,直到找到起始頂點)
endd=i
break
print l
print l[::
-1]
輸出
[
'thom'
,'claire'
,'you'][
'you'
,'claire'
,'thom'
]
python深度優先搜尋和廣度優先搜尋
圖的深度優先搜尋 depth first search 和樹的先序遍歷比較類似。它的思想 假設初始狀態是圖中所有頂點均未被訪問,則從某個頂點v出發,首先訪問該頂點,然後依次從它的各個未被訪問的鄰接點出發深度優先搜尋遍歷圖,直至圖中所有和v有路徑相通的頂點都被訪問到。若此時尚有其他頂點未被訪問到,則另...
搜尋 廣度優先搜尋
廣度優先搜尋一層一層地進行遍歷,每層遍歷都是以上一層遍歷的結果作為起點,遍歷乙個距離能訪問到的所有節點。需要注意的是,遍歷過的節點不能再次被遍歷。class solution,int shortestpathbinarymatrix vectorint grid length return 1 cl...
廣度優先搜尋
include include include include using namespace std struct node 圖頂點結構定義 typedef struct node graph 圖形的結構新型態 struct node head 9 圖形頂點陣列 int visited 9 遍歷標...