(原創)廣度優先搜尋解決最短路徑問題

2021-08-10 18:07:46 字數 1797 閱讀 6904

廣度優先搜尋用於解決兩種問題:

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 走...