1. 程式人生 > >一些面試2

一些面試2

算法 短路徑 可能 man cnblogs 正確答案 .cn 負權邊 最短路

1.最短路徑算法 //轉自:https://www.cnblogs.com/hxsyl/p/3270401.html

迪傑斯特拉算法:不能處理負權的邊,因為它的過程就是尋找到源點最短的邊,可能會找不到最短的邊。如

存在三個點,1和2之間權值為3,1和3之間權值為4,2和3之間權值為-2.這樣的話d[1,2]就會被錯求為3.而正確答案是2.

也就是說一個已經被標記為訪問過的點(已經找到到源點的最短路徑的點)很有可能是可以通過一個負權邊,存在更短的最短路徑的。

弗洛伊德算法:就是一個三重循環,對每兩個節點計算出中間有其他節點作為中間節點時的距離,查看是不是更小。

貝爾曼福特算法:可以用於存在負權邊的單源最短路徑算法。就是每次循環都更新所有點的dist[],若n-1次之後仍可進行松弛操作,那麽就說明存在負值回路。Bellman-Ford算法是否一定要循環n-1次麽?未必!其實只要在某次循環過程中,考慮每條邊後,都沒能改變當前源點到所有頂點的最短路徑長度。 //其實這個還不太明白。。

SPFA:也就是對點進入隊列,標記,出隊列取消標記,可能多次進入隊列,直到隊列為空即完成單源最短路徑的求解。

一些面試2