最短路徑—Floyd演算法
阿新 • • 發佈:2018-11-26
Floyd演算法:
1,從任意一條單邊路徑開始。所有兩點之間的距離是邊的權,如果兩點之間沒有邊相連,則權為無窮大。
2,對於每一對頂點 u 和 v,看看是否存在一個頂點 w 使得從 u 到 w 再到 v 比已知的路徑更短。如果是更新它。
Floyd-Warshall——只有五行的演算法
求任意兩個點之間的最短路程。 從i號頂點到j號頂點只經過前k號頂點的最短路程,這是一種動態規劃的思想。
演算法作為三個巢狀for迴圈。
for(k=1;k<=n;k++) for(i=1;i<=n;i++) for(j=1;j<=n;j++) if(e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j];
n個頂點,m條邊,接下來的m行每一行有3個數,頂點u,v以及他們之間的距離 l。
#include<iostream> using namespace std; int e[111][111]; int n,m,u,v,l; const int inf=999999; void init() { for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { if(i==j) e[i][j]=0; else e[i][j]=inf; } } } void floyd() { int i,j,k; for(k=1;k<=n;k++) { for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(e[i][k]<inf&&e[k][j]<inf&&e[i][j]>e[i][k]+e[k][j]) e[i][j]=e[i][k]+e[k][j]; } } } } int main() { int i,j; cin>>n>>m; init(); //讀入邊 for(i=1;i<=m;i++) { cin>>u>>v>>l; e[u][v]=l; } floyd(); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { cout<<e[i][j]<<endl; } } return 0; }