1. 程式人生 > 其它 >最長路【模板】

最長路【模板】

1.dijkastra 是不可行的

如果選取dijkstra求取最長路,那麼思想肯定就是選取當前權值最大的點,並且選取最長的路徑。但是這種思想是錯誤的!我們從源點來舉個例子。a—b c表示的是a,b之間的路徑長度為c

12 2

13 1

34 1

42 1

我們的目的是求解1到2這兩個點之間的最小距離。然後說一下步驟

    我們先將1的路徑權值標記為0,然後壓入優先佇列
    然後1出隊,更新2,3。將2,3壓入隊。
    然後我們會選取優先佇列裡面權值較大的2出佇列,用2來更新4。
    好了,接下來就沒有結點2的事情了,但是此時2到0的最長距離就定格在2。但實際上最長路應該是3.


————————————————
版權宣告:本文為CSDN博主「Salix_」的原創文章,遵循CC 
4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/qq_41755258/article/details/85015285
View Code

2.floyed和bellman—ford

直接將所有的邊都取負,然後按照最短路求解就行了。但是對於有環出現的情況,floyed就不行了,我們就需要藉助bellman演算法來判負環。

    floyed的實質是動態規劃,不能處理負環。如果點的數量不是特別多的話,可以使用深搜(通過vis陣列標記,看是否會遍歷到之前已經遍歷過的點)。如果點的個數非常多的話,就得使用ford或者是spfa。
    bell—ford可以處理負環,也是通過判斷鬆弛的次數是不是超過了N次。


————————————————
版權宣告:本文為CSDN博主「Salix_」的原創文章,遵循CC 
4.0 BY-SA版權協議,轉載請附上原文出處連結及本宣告。 原文連結:https://blog.csdn.net/qq_41755258/article/details/85015285
View Code