1. 程式人生 > 其它 >P5905 【模板】Johnson 全源最短路

P5905 【模板】Johnson 全源最短路

P5905 【模板】Johnson 全源最短路
...

處理負權邊的方法十分巧妙,就像是勢能一樣

演算法上文連結有詳解,就不贅述了,這樣就實現了dij也可以處理負邊

是需要提前預處理一遍,建立超級源點用bellman-ford跑一遍就行

然後是第一個問題,總是TLE

然後發現自己dij的板子都打得有問題/kk

if(vis[tmp])continue;

一定要把放在前面判斷,因為dij是按dis排序的,所以先遍歷到一定dis更短

這個可以快不少

第二個問題是對於負權邊的判斷

我感覺這點還蠻重要的

對於鬆弛的計數並不是按照更新數來算的

而是對於是否更新且是否在佇列中來算的

Old:

if (h[to] > h[node] + edge[i].value)
{
    h[to] = h[node] + edge[i].value;
    qcnt[to]++;
    if (qcnt[to] > n)
        return false;
    if (!inqueue[to])
        q.push(to), inqueue[to] = true;
}

New:

if (h[to] > h[node] + edge[i].value)
{
    h[to] = h[node] + edge[i].value;
    if (!inqueue[to])
    {
        q.push(to), inqueue[to] = true;
        qcnt[to]++;
        if (qcnt[to] > n)
            return false;
    }
}

這不是我的程式碼(我寫的比較亂)

這其中蘊含的問題是一樣的

hack資料

2 3
2 1 -3
2 1 -2
2 1 -1

由於重邊的存在,所以只能用後者的寫法

搞了一下午,菜死了/kk