BF

每次遍历所有边权跟上次的比dist,prev+c更新。
n-1之后还可更新有负权回路。
注意prev[a]不可是INF

次数限制的最短路径

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>

using namespace std;

struct E{
    int x,y,z;
};

int INF = 0x3f3f3f3f;
//最高是3f3f3f3f,x y z 如果x是INF说明没有更新,如果结果是比INF/2大说明有负数
//遍历k次,dist[b]与prev[a]+c比较与更新
int main()
{
    int n,m,k;
    cin >> n >> m >> k;
    vector<E> eg(m);
    vector<int> dist(n+1,INF);
    vector<int> prev(n+1,INF);
    for (int i = 0; i < m; i ++ ){
        cin >> eg[i].x >> eg[i].y >> eg[i].z;
    }
    dist[1] = 0;
    int flag = 0;
    int a,b,c;
    for (int i = 1; i <= k; i ++ ){
        flag = 0;
        prev = dist;
        for(auto o: eg){
            a = o.x; b = o.y; c = o.z;
            if(prev[a]!=INF){
                dist[b] = min(dist[b],prev[a]+c);//跟上次的比不然不确定
            }
        }
    }
    if(dist[n]>INF/2){
        cout << "impossible";
    }
    else{
        cout << dist[n];
    }
    return 0;
}
posted @ 2025-08-17 20:51  .N1nEmAn  阅读(7)  评论(0)    收藏  举报