廣度優先搜尋用於解決兩種問題:
1.從某點到某點是否存在路徑?
2.若存在,最短的是哪條?
1.圖有點和邊組成。
2.當圖中的所有邊的指向都是單向的,這種圖叫做有向圖。若a指向b,則b為a的鄰居。
3.當圖中存在一條或一條以上的沒有箭頭的邊,即a指向b,且b指向a,這種圖成為無向圖。其中,a和b互為鄰居。
4.如下圖,其中若從a出發,則b、c、d是一度關係,e、f是二度關係,以此類推。
1.佇列只包括兩種操作:入隊與出隊。
2.佇列是一種先進先出的資料結構(first in first out,fifo);棧是一種後進先出的資料結構(last in first out,lifo)。
假設要在上圖中尋找從a到e的最短路徑:
1.將a的一度關係加入搜尋佇列。
2.判斷搜尋佇列是否為空,是則返回false,表示不存在到e的路徑,否則檢查佇列的第乙個點。
2.檢查該點是否被搜尋過了,是則跳過。否則判斷該點是否是e,是則返回true,否則將該點移除,並放入已經搜尋過的點的列表,將該點的下一層加入整個待搜尋佇列的後面。
3.重複第二步。
注意!!
a.要將下一層放在佇列的最後面,才能確保找到的是最短路徑。
b.檢查過的點要放入已經搜尋過的佇列,並在每次檢查時判斷該點是否在搜尋過的佇列裡,防止重複搜尋。否則當出現無向圖時,會進入死迴圈。
廣度優先搜尋的執行時間是:o(v+e)
解析:廣度優先遍歷需要在整個圖網中進行遍歷,所以會遍歷每一條邊,所以至少執行時間是o(邊數),即o(e),e為邊數;
而每次遍歷乙個點,就需要將它的下一層新增到佇列,在雜湊表中新增乙個物件是常數時間o(1),所以執行時間還要加上o(節點數),即o(v),v是節點數。
所以最後的執行時間是:o(v) + o(e) = o(v+e)。
"""
廣度優先搜尋
"""dict = {}
dict["oysq"] = ["a", "b", "c"]
dict["a"] = ["e", "f", "g"]
dict["b"] = ["h", "i"]
dict["c"] =
dict["d"] =
dict["e"] =
dict["f"] =
dict["g"] =
dict["h"] = ["j", "k"]
dict["i"] =
dict["j"] =
dict["k"] = ["l"]
dict["l"] =
def search(dict, head, target):
search_list =
search_list += dict[head]
searched =
while search_list != :
temp = search_list.pop()
if searched.count(temp) == 0:
if temp == target:
return true;
else:
search_list += dict[temp]
searched += temp
return false
print search(dict, "oysq", "c")
print search(dict, "oysq", "v")
最短路徑問題 廣度優先搜尋解法
輸入乙個數值n,表示一塊nxn的區域,其中數值1表示訊號強,0表示訊號弱,例如 1 0 1 1 1 1 1 1 1 尋找所有訊號強的路徑 不包含0 中的最短路徑,並輸出其最短路徑的值,如果不存在最短路徑 到不了右下角 則輸出 1。思路 將整個nxn陣列建立成乙個二維圖,利用廣度優先搜尋演算法進行搜尋...
利用廣度優先搜尋求最短路徑
注 下面是以無權的圖為基礎的 廣度優先搜尋 輸入 輸入n個頂點,m條邊,起點的編號 跟著再輸入邊x,y 輸出 該起點到達各個頂點最少經過幾條邊 按編號從小打大輸出,包括自己哦 樣例 輸入 5 5 2 1 22 3 2 43 4 3 5 輸出 1 0112 我一開始就是覺得用廣度優先搜尋,結果在廣度優...
最短路徑條數問題 廣度優先搜尋
給定如圖所示的無向連通圖,假定圖中所有邊的權值都為1,顯然,從源點a到終點t的最短路徑有多條,求不同的最短路徑的數目。ps 上圖的a是第0號節點,b是第1號節點,其他同理。權值相同的最短路徑問題,則單源點dijkstra演算法退化成bfs廣度優先搜尋 廣度優先搜尋,即 從a 走一步可以到達b或e 走...