1. 程式人生 > 其它 >【bellman-ford】AcWing853.有邊數限制的最短路——模板題

【bellman-ford】AcWing853.有邊數限制的最短路——模板題

AcWing853.有邊數限制的最短路

題解

存在負權迴路可能會導致無法求最短路,比如說圖中 2的自環,沒轉一圈距離-1,我們求1到5的距離可以轉無窮圈2,即1到2的距離為 -無窮

迴圈n次求的是長度不超過n條邊的最短路

#include <iostream>
#include <cstring>
using namespace std;

const int N = 10010, M = 510;

int n, m ,k;
int dist[M], backup[M]; //backup用於備份由於bellaman_ford會改變前面的dist[a]導致結果不對
struct{
    int a, b, w;
}edge[N];

void bellman_ford()
{
    memset(dist, 0x3f3f3f3f, sizeof dist);
    dist[1] = 0;
    for(int i = 0; i < k; ++i)
    {
        memcpy(backup, dist, sizeof dist);
        for(int j = 0; j < m; ++j)
            {
                auto t = edge[j];
                dist[t.b] = min(dist[t.b], backup[t.a] + t.w);
            }
    }
}

int main()
{
    cin >> n >> m >> k;
    int a, b, w;
    for(int i = 0; i < m; ++i)
    {
        cin >> a >> b >> w;
        edge[i] = {a, b, w};
    }
    bellman_ford();
    //負權邊可能會導致1到n的不可能路線變小
    if(dist[n] > 0x3f3f3f3f / 2) cout << "impossible" << endl;
    else cout << dist[n] << endl;
    return 0;
}