floyd算法原理:三重循环,遍历从i点到j点的经过的所有中介点k(1~n),筛选出经过某个中介点时距离最短
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 210, INF = 1e9;
int d[N][N];//用邻接矩阵存图
int n, m, k;
void floyd(){
for(int k = 1; k <= n; k ++ ){//k是中节点,即i顶点通过k点到达j点
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]);//遍历i到k的路径经过的1~n的点,找出其中最短距离赋值
}
}
}
}
int main()
{
cin>>n>>m>>k;
//初始化距离值
for(int i = 1; i <=n; i ++ ){
for(int j = 1; j <= n; j ++ ){
if(i == j){
d[i][j] = 0;//当ih和j是同一个点时,i到j的距离值为0
}
else{
d[i][j] = INF;//令不重合的两个点的距离为无穷大
}
}
}
while(m -- ){
int a, b, c;
cin>>a>>b>>c;
d[a][b] = min(d[a][b], c);//比较新输入的值和d[a][b]原本的值,选择较小值赋给d[a][b]
}
floyd();//运行
while(k -- ){
int a, b;
cin>>a>>b;
if(d[a][b] > INF / 2){//如果d[a][b]值特别大,代表a、b之间不存在最短路径(不用‘=’是因为可能存在与a或b相连的点,使d[a][b]被更新
cout<<"impossible"<<endl;
}
else{
cout<<d[a][b]<<endl;
}
}
return 0;
}