DIJ的優化,和spfa的優化

2022-03-17 17:38:23 字數 1325 閱讀 5556

spfa和dij求最短路的演算法的坑點一直是很多的。經常會讓人搞不懂。

用過載運算子來排序,如:

struct cmp 

};

這種做法是不對的,該dis值在堆裡不會更新甚至會堵住。

目前只有兩種優化演算法最可靠,分別為優先佇列來優化spfa或dij。

每次從堆中只需要取出到t的最短路最小的元素進行鬆弛,這樣便可以大大縮小鬆弛的次數,效率從而得到提高。

#include #include #include #include #include #define int long long

using namespace std;

int n, m, s, a, b, vis[1000100], dis[1000100], cnt, lin[1000100];

struct cym e[2000100];

struct cmp

};inline void add(int u, int v, int l)

priority_queue , cmp> q;

signed main()

dis[s] = 0;

q.push(s);

// printf("%d\n", lin[s]);

while(!q.empty())}}

}for (int i = 1; i <= n; i++)

printf("%lld ", dis[i]);

}

#include #include #include #include #include using namespace std;

int n, m, s, lin[100010], cnt, a, b, c, vis[100010];

struct cym dis[100100];

struct edge e[200010];

inline void add(int f, int t, int l)

bool operator < (cym a, cym b)

priority_queue q;

int main()

for (int i = 1; i <= n; i++)

dis[i].d = 2147483647, dis[i].num = i;

dis[s].d = 0;

q.push(dis[s]);

while(!q.empty())

for (int i = 1; i <= n; i++)

printf("%d ", dis[i].d);

}

用Dij的思想優化DP

如果 dp 的狀態轉移方程為 f i min 那麼我們就可以考慮用 dij 的思想去優化它 因為如果某個點的 f 值是最小的,那麼就沒有其它的點可以影響它 因此我們每一次從堆中取出最小的點對其它點進行更新即可 題目描述 傳送門分析 按照期望題一般的做法,我們設 f u 為從 u 走到終點 n 的期望...

Spfa優化小結

spfa是bellman ford的優化。但是spfa還有優化餘地 一 空間優化,用迴圈佇列 要點 1 判斷隊列為空 只能用if f r if f2 取餘操作 只要加到f r操作的 所有地方就行了 二 簡單而有效的優化slf 如果隊首元素較大,則將新元素插到隊首,否則插到隊尾 slf優化 341.c...

SPFA優化總結

spfa乙個很快很短適合稀疏圖的單元最短路的演算法。但是有時用優化,在稠密圖中跑的很快。優化1 slf 如果當前要入隊乙個點i,如果d i d head 比隊首要優 就放入隊首,否則就放入隊尾。這個本來要用乙個雙端佇列來實現的,但是要乙個超級好實現的方法,但是比較水,但是實測很快,加進來乙個tail...