弗洛伊德

求最短路径

注意一下读取边的时候,最开始都设置为最大,然后读取的时候必须比现在的小才读取,用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;
}
posted @ 2025-08-18 17:22  .N1nEmAn  阅读(7)  评论(0)    收藏  举报