floyd

用处

单源最短路径。

实现

枚举一个中间点和一个起点和终点,用$d[i][k]+d[k][i]$来更新$d[i][j]$。

复杂度$O(n^3)$,但写起来方便(对于邻接矩阵)。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

#define M 105
#define INF 1000000005
using namespace std;
int w[M][M];
int () {
ios::sync_with_stdio(false);
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++) w[i][j]=INF;
for(int i=1; i<=m; i++) {
int x,y,l;
cin>>x>>y>>l;
if(w[x][y]>0&&w[x][y]!=INF) continue;
w[x][y]=l;
}
for(int i=1; i<=n; i++) w[i][i]=0;//初始化
for(int k=1; k<=n; k++)//Floyd 不多解释 (k要放在最上层)
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
w[i][j]=min(w[i][k]+w[k][j],w[i][j]);
if(w[1][n]==INF) cout<<"-1";
else
cout<<w[1][n];
return 0;
}