1. 程式人生 > >FLoyd算法的擴展

FLoyd算法的擴展

algo 算法 article 包含 style 最短 print 暴力 amp

FLoyd算法的擴展

Floyd算法是一種求任意點到任意點的最短距離。可以求邊權為負值,有向圖、無向圖等的最短路徑。但是邊權可以有負權值的邊,但不能有包含負權值邊組成的回路,不然算出來的就不是正確答案!!這個算法效率很低可以說是暴力。但是這種暴力是帶著動態規劃的暴力!!但是卻不能有邊權和為負值的回路

上代碼


#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define Inf 1<<29

int mp[100][100
]; int n,m; int main(){ while(~scanf("%d%d",&n,&m)){//代表有n個節點 m 條權值邊 for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j){//初始化默認距離表示i節點到j節點的距離。節點相同距離為0 mp[i][j]=Inf; }else{ mp[i][j]=0
; } } } int a,b,c; for(int i=1;i<=m;i++){ scanf("%d%d%d",&a,&b,&c); mp[a][b]=c; // mp[b][a]=c;//寫上這個就是無向圖 } for(int k=1;k<=n;k++){//主要代碼實現區,可以模擬一下。關鍵是模擬,然後自己再想為什麽。。 for
(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(i!=j&&j!=k){ mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]); } } } } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){//在這裏輸出任意點到任意點的距離 printf("dis %d %d = %d\n",i,j,mp[i][j]); } } } return 0; }

FLoyd算法的擴展