标准弗洛伊德算法,三重循环。
循环结束之后 d[i][j]存储的就是点 i 到点 j 的最短距离。
需要注意循环顺序不能变:第一层枚举中间点,第二层和第三层枚举起点和终点。
特点:
1.复杂度为O(n^3),只能处理200以内的点。
2.一次求出所有结点直接的最短路径。
3.能处理有负权边的图。
模板代码:
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int N=205;
int n,m,d[N][N];
int main(){
scanf("%d%d%d",&n,&m);
//初始化
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
d[i][j]=i==j?0:INF; //自己到自己的距离为0
//输入边
for(int i=0,x,y,w;i<m;i++){
scanf("%d%d%d",&x,&y,&x);
d[x][y]=d[y][x]=min(d[x][y],w);
}
//Floyd核心代码
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
// if(d[i][k]==INF||d[k][j]==INF) continue; //防止负权影响INF
if(d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
// e[i][j]=min(e[i][j],e[i][k]+e[k][j]); //数据量大时,min会慢一些
}
}
}
cout<<d[1][n];
return 0;
}