dijkstra算法---通過邊實現松弛
阿新 • • 發佈:2017-08-20
素材 i++ amp 技術分享 數組 一個 strong 選擇 ima
圖片素材借鑒啊哈磊的博客
該算法用於解決一個點到其余各頂點的最短路徑
先來一張圖,求1點到6點的最短路徑
這讓我想起了差點掛科的運籌學
先用一個二維數組
還有一個一維數組存儲1點到各點的距離
這個一維數組的值稱為估計值。在1點可直接到達的點中選擇一個最近的點,即點2.然後點2的值也就成為了確定值。
why。因為路徑是正數,也不可能通過其他的中轉點縮短點1到點2的路程。
經過了點2,再看看點2能夠到達哪些點。即點3和點4。先討論下通過點2這個中轉點是否能夠縮短點1到點3的路程。答案是可以的。1+9<12.修改一維數組對應的值。
這個就叫松弛
同理比較點1到點4距離和通過點2中轉的距離。
剩下的3,4,5,6點自己試試。不然運籌學很容易掛的
最後答案是
貼出核心算法
for(i=1;i<=n-1;i++) { //找到離1號頂點最近的頂點 min=inf;//初始min為正無窮 for(j=1;j<=n;j++) { if(book[j]==0 && dis[j]<min) { min=dis[j];//取得離源點直接相連的最近的點的距離 u=j; } } book[u]=1;//將該點納入已經確定要走的點的集合 for(v=1;v<=n;v++)//這裏就如同遍歷哥各點到點2的距離 { if(e[u][v]<inf) { if(dis[v]>dis[u]+e[u][v]) dis[v]=dis[u]+e[u][v]; } } }
dijkstra算法---通過邊實現松弛