多源路算法(O(n ^ 3))
Floyd求最短路
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 210,null = 0x3f3f3f3f;
int d[N][N];
int n,m;
//遍历更新最短路,排除自环
void floyd(){
for(int k = 1;k <= n;k ++)
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
d[i][j] = min(d[i][j],d[i][k] + d[k][j]);
}
int main(){
int q;
cin >> n >> m >> q;
//初始化
for(int i = 1;i <= n;i ++)
for(int j = 1;j <= n;j ++)
if(i == j) d[i][j] = 0;
else d[i][j] = null;
//赋权
while(m --){
int a,b,c;
cin >> a >> b >> c;
d[a][b] = min(d[a][b],c);
}
floyd();
while(q --){
int a,b;
cin >> a >> b;
if(d[a][b] > null / 2) puts("impossible");
else cout << d[a][b];
}
}