代码模板
#include<bits/stdc++.h>
using namespace std;
const int N=101;
int dp[N][N];//在此处dp其实就是邻接矩阵
void floyd(int n){
for(int k=1;k<=n;k++){//注意 !!k为最外层循环
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k][j]);
}
}
}
}
int main(){
memset(dp,0x3f,sizeof(dp));
for(int i=0;i<N;i++){
dp[i][i]=0;
}
int n,m;
cin >> n >> m;
int t=n;
int u,v,w;
while(t--){
cin >> u >> v >> w;
dp[u][v]=dp[v][u]=w;
}
floyd(n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(dp[i][j]==0x3f3f3f3f){
printf("%d -> %d : Untouchable\n",i,j);
}else{
printf("%d -> %d : %d\n",i,j,dp[i][j]);
}
}
}
return 0;
}
floyd图示:
d
s
t
[
i
−
>
j
]
=
m
i
n
(
d
s
t
[
i
−
>
j
]
,
d
s
t
[
i
−
>
k
]
+
d
s
t
[
k
−
>
j
]
)
dst[i->j] = min(dst[i->j],dst[i->k]+dst[k->j])
dst[i−>j]=min(dst[i−>j],dst[i−>k]+dst[k−>j])
k
为任意节点(
i
可途径
k
到达
j
)
k为任意节点(i可途径k到达j)
k为任意节点(i可途径k到达j)
需要注意的点:
- floyd算法实现过程中,k(中间节点)需要作为外层循环
- 初始化邻接矩阵时需要对角线赋0
- 获取节点距离时的dp[u][v]=dp[v][u]=min(dp[u][v],w);用于避免重边(两节点之间只保留最短的路径)