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...