floyd算法是通过动态规划特别是记住公式,f[i, j, k]表示从i走到j的路径上除i和j点外只经过1到k的点的所有路径的最短距离。那么f[i, j, k] = min(f[i, j, k - 1), f[i, k, k - 1] + f[k, j, k - 1]。
因此在计算第k层的f[i, j]的时候必须先将第k - 1层的所有状态计算出来,所以需要把k放在最外层。
那为什么判断不连通的条件为大于0x3f3f3f3f/2呢?,因为可能存在不连通的点但是能把那个点更新了,比如i到j的距离是0x3f3f3f3f但是j到k的距离是-1,可以更新最短距离就不是0x3f3f3f3f了
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1e5+10;
int n,m,k;
int g[210][210];
void floyd(){
int k,i,j;
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
}
}
}
}
int main(){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
g[i][j]=0;
}
else{
g[i][j]=0x3f3f3f3f;
}
}
}
while(m--){
int a,b,c;
cin>>a>>b>>c;
g[a][b]=min(g[a][b],c);
}
floyd();
while(k--){
int a,b;
cin>>a>>b;
if(g[a][b]>0x3f3f3f3f/2){
cout<<"impossible"<<endl;
}
else{
cout<<g[a][b]<<endl;
}
}
}