题目思路
这道题就是一道简单的Floyd求最短路的应用,y总说这个算法验证起来太难了,所以让我们不需要去准备了,以后看算法导论的时候好好看看吧,然后这道题的思路没啥难得,感觉就是很简单的一个三维背包问题,所有没啥好说的,直接看代码讲解吧
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF = 0x3f3f3f3f, N=210;
int n,m,k;
int dist[N][N];
int main(){
cin>>n>>m>>k;
memset(dist,0x3f,sizeof dist);
//因为这道题是讲的任意俩个点之间的距离问题,所以我们一开始就把自己离自己的距离初始化为0即可
for(int i=1;i<=n;i++) dist[i][i]=0;
while(m--){
int a,b,c;
cin>>a>>b>>c;
dist[a][b] = min(dist[a][b],c);
}
//这里后面7行代码就是Floyd求最短路的算法,其实就是个三维背包问题很简单。
for(int k=1;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
dist[i][j] = min(dist[i][j],dist[i][k] + dist[k][j]);
}
}
}
while(k--){
int a,b;
cin>>a>>b;
//为啥判断条件不是dist[a][b] == INF,因为里面的距离有负的所以不行
if(dist[a][b] > INF/2){
cout<<"impossible"<<endl;
}else{
cout<<dist[a][b]<<endl;
}
}
return 0;
}