鏈路狀態路由演算法,給出的例子便是迪科斯徹演算法,dijkstra,儘管在2023年8月23日用c和c++實現了演算法,詳見《迪科斯特演算法》,但好像沒有用文字總結一下,結合題再加深下吧。
如題:2023年10月
分析:要解決的問題:
廣度優先搜尋解決賦權有向圖或者無向圖的單源最短路徑問題。
思路:dijkstra演算法採用的是一種貪心的策略,宣告乙個陣列dis來儲存源點到各個頂點的最短距離
另乙個儲存已經找到了最短路徑的頂點的集合t。
步驟:1、從dis陣列選擇最小值,則該值就是源點s到該值對應的頂點的最短路徑,並且把該點加入到t中。
2、重新計算新加入的頂點到達其他點的路徑長度是否比源點直接到達短,如果是,那麼就替換這些頂點在dis中的值。
3、從dis中找出最小值,重複1~3.直到遍歷完樹(此時的樹是腦補出來的),最終的dis陣列就是最短的距離。
下面結合題來做一下詳細的分析:
樹已經給畫出來了,所以不需要腦補了。下面就是求迪科斯徹演算法就行了。
根據以上的步驟:
1、選建立乙個從源點開始的最短路徑陣列及最短路徑頂點陣列:t=,dis=;
注:dis[*]代表從選定的最短頂到到*的距離,如dis[y],代表從x到y的距離
2、從dis中找到距離最小的路徑顯然是dis[w],將w加入到t中,然後重新從w出發計算與它直連邊的距離。t=;dis=+(之前)dis[v]要小於之前的2<3,所以更新下dis[v]=2.現在dis=;從這裡面找最短的,那就是dis[v],
3、將v點加入到t=,重新計算從v結點出發計算與它直邊邊距離,已經在集合t中的點不看。dis=;現在的dis=+發現dis[u]也有了更小值,所以需要更新dis=
4、剩下的便是重複以上步驟直到各個頂點加入到t中來。
現在有dis[y]==dis[u],兩個最短邊距,取哪個頂點加入t呢?題目告訴了,要選擇編號小的節點加入,u在y前,所以選擇u加入t.
t=;wv在t,不需要看,只看ts,所以dis=對比上一步dis,需要更新dis[t]=5.所以為
dis=
5、找了最小的dis[y],加入到t=,wv在t裡,所以只看zt dis[t]=4+dis[y]=7 dis[z]=10+dis[y]=13,所以現在的dis=,找到最小的是dis[t],將t加入t中
6、t=,和t直連的是uvzys,排除uvy,看z,s .dis[s]=1+dis[t]=6,dis[z]=2+dis[t]=2+5=7,需要更新,現在dis=,找出最小的是dis[s],加入t
7、t=與s直連的是t和u都在t中,所以不需要更新
8、剩下就是z了,也不需要更新,直接加入。
最後,排下dis陣列。
dis=
得到這個陣列後,填下答案就可以了。
目的下一跳代價s
tuvw
w1yz
w是第二個加入的,屬於直連邊,代價是1,題目已經給出
v是通過w加入的,所以從x到v的下一跳是w,代價為1
目的下一跳代價s
tuvw
2ww
1yzy是第四個加入的,是通過v加入的,所以下一跳 ,x -> w -> v 代價是3
目的下一跳代價s
tuvx -> w2ww
1yx -> w -> v
3
z依次填入表就可以了。
目的下一跳代價s
x -> w -> v -> y -> t6t
x -> w -> v -> u5u
x -> w -> v3v
x -> w2ww
1yx -> w -> v3
zx -> w -> v -> y -> t
7標準答案:
目的下一跳代價s
w6tw
5uw3
vw2w
w1yw
3zw7
做題還是得細心,每一步都不要想當然!
鏈路狀態路由選擇
鏈路狀態路由 link state 主要思想 發現 它的鄰居節點們,了解它們的網路位址 設定 到它的每個鄰居的成本度量 構造 乙個分組,包含它所了解到的所有資訊 傳送 這個分組給所有其他的路由器 計算 到每個路由器的最短路徑 1 發現鄰居節點 當乙個路由器啟動的時候,在每個點到點的線路傳送乙個特別的...
鏈路狀態路由協議
鏈路狀態路由協議則如同使用地圖一樣,有了地圖,您就可以看到所有潛在的路徑並確定自己的首選路徑。鏈路的狀態是指與該路由器直連網路的狀態,幷包含關於網路型別以及那些網路中與該路由器相鄰的所有路由器的資訊 因此得名鏈路狀態路由協議。鏈路狀態路由協議 鏈路狀態路由協議又稱為 最短路徑優先協議,它建基於 ed...
鏈路狀態路由協議OSPF
執行鏈路狀態路由協議的路由器只保留自己知道的部分網路的拓撲資訊,但是所有路由器儲存的路由資訊的總和則可以提供整個網路的拓撲結構檢視。各個鏈路狀態路由器根據自己的路由表計算到達目標的最短通路。鏈路狀態路由協議在網路拓撲結構改變時觸發路由更新功能。執行鏈路狀態協議的路由器通過hello協議來發現鄰居,並...