多源最短路(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就解決了,即上面的第一個代碼。