求一個圖中各個點之間的距離,弗洛伊德算法無疑是非常簡單的,但是以前只會求每個點之間的dist,(最短距離),不會求最短距離的路徑怎么走,沒有理解path最后怎么輸出
先看算法核心代碼
初始化注意:
1.path[i][j] = j
2.dist對角線為零
核心代碼:
for(int i = 0; i <= 13; i++) for(int j = 0; j <= 13; j++) for(int k = 0; k <= 13; k++) { if(dist[j][k] > dist[j][i] + dist[i][k]) { dist[j][k] = dist[j][i] + dist[i][k]; path[j][k] = path[j][i]; } }
注: 1. i為每次加入的點
2.如果通過i到k 更近則更新dist與path
3.path存的是前驅,即由path[j][k] 即由j->k第一個需要經過的點。
所以在輸出時應有如下代碼
i->k 路徑
int k = path[a1][a2]; if(a1 != a2) while(1) { cout<<"->"<<de[k]; if(k == a2) break; k = path[k][a2]; } cout<<endl;
依次輸出中間的點並不斷更新中間的點,當更新點到達k是則到達我們的目的,結束即可。
下邊對弗洛伊德算法進行討論
其能解決負權邊的問題,但是其解決不了負權回路的問題,因為負權回路的圖是沒有最短路徑的,最小是負無窮。