最短路算法理解

多源最短路(Floyd-Warshall算法):

核心代碼:

for(int p=1; p<=n; p++)
    for(int i=1; i<=n; i++)
      for(int j=1; j<=n; j++)
        dis[i][j] = min(dis[i][p]+dis[p][j], dis[i][j]);

理解:此代碼是由子問題——“特定點i到特定點j的最短路”擴展成“任意兩點間的最短路”問題的。

情景(特定點i到特定點j的最短路):我現在知道a到b點之間的天生距離,現在我要尋找方法來使這個距離縮短。然後我發現了——咦?旁邊還有一個c點,那我們就看看a到c加上c到b的距離會不會比a到b天生的距離短,如果是,則夢想成真。如此再不斷察看ab間的距離能不能利用新的點當中轉站來縮短。

此時的代碼如下:

for(int p=1; p<=n; p++)
        dis[a][b] = min(dis[a][p]+dis[p][b], dis[a][b]);

當然,如果我們的目的是隻求ab間的最短路,這樣就完成了。但是如果我們想要得到“任意兩點間的最短路”,那麼很簡單,把a點和b點改成循環1~n就解決了,即上面的第一個代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章