弗洛伊德
求最短路径
注意一下读取边的时候,最开始都设置为最大,然后读取的时候必须比现在的小才读取,用min就行。注意初始化自己到自己是0。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int INF=0x3f3f3f3f;
int n,m,count;
int a,b,c;
cin >> n >> m >> count;
int E[201][201] = {0};
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j <= n; j ++ ){
E[i][j] = INF;
if(i==j)E[i][j]=0;//注意这个,自己的时候是0
}
}
for (int i = 0; i < m; i ++ ){
cin >> a >> b >> c;
E[a][b] = min(E[a][b],c);
//注意这个,跟自己一样的时候归零,还有就是不能比之前的大,划重点,这次数据有点强力了,可能会丢分
}
//不同的中间节点,顺序是k i j,k是中间
for (int k = 1; k <= n; k ++ ){
for (int i = 1; i <= n; i ++ ){
for (int j = 1; j <= n; j ++ ){
E[i][j] = min(E[i][j],E[i][k]+E[k][j]);
}
}
}
for (int i = 0; i < count; i ++ ){
cin >> a >> b;
if(E[a][b]<INF/2){
cout << E[a][b];
}else{
cout << "impossible";
}
cout << endl;
}
return 0;
}