關於Dijkstra 和 Bellman-ford算法的簡單理解


兩個算法都是跟求圖的有源最短路徑有關。Dijkstra主要針對的是無負權值節點的圖,而Bellman-Ford算法則是可以處理有負權值的有向圖的最短路徑問題。兩者都用到了一個“松弛計算”的方法,也就是在遍歷圖的頂點和邊的過程中修改距離數組的值,從而來找出最短路徑。
   Dijkstra算法針對無負權值的圖,求源點到某特定點的最短距離。大概的思路是:
   將圖的頂點分成兩個集合S,V。S中開始時只有源點,而V中是剩下的點。有一個dis[n](n為圖的節點數)的數組來記錄每一個點到源點的特殊距離,這個距離都是從源點只經過S中的點而到達所求點的距離。每次的操作需要用“松弛計算”更新dis,遍歷完成即可得到最短距離。
    而Bellman-Ford算法主要是針對有負權值的圖。來判斷該圖中是否有負回路,或者存在最短路徑的點。判斷的思路,從源點出發,進行n - 1(n為頂點數)遍歷,在每次的遍歷過程中,對所有的邊進行遍歷判斷,同樣是利用松弛計算的思想,dis[v] > dis[u] + w(u, v)不斷更新dis數組的值,直到循環結束。然后就是這個算法最精彩的地方了,再對所有的邊進行一次遍歷,看是否存在dis[v] > dis[u] + w(u, v)的邊,若存在,則返回FALSE,說明圖中存在負回路;若不存在,則返回TRUE,dis數組記錄的就是每一個點到源點的最小值。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM