關於最短路 負環 差分約束系統的一點筆記

2022-04-06 19:37:26 字數 1815 閱讀 1217

「可以」沒有環,最多\(|v|-1\)條邊

有負環則不存在最短路

會形成最短路徑樹

演算法dijkstra 貪心,當\(d_u\)是最小時要滿足之後\(d_u\)不會更小,不能處理負權邊

bellman-ford 迭代n-1輪,用邊鬆弛

spfa 佇列優化的bellman-ford

最短路的線性規劃形式

最大化 \(d_i\)

滿足三角不等式 $d_v \le d_u + w(u,v),\ $

\(d_s=0\)

說明:上述約束對應了無窮組解。最短路求的是滿足約束的最大值。因為三角不等式要求取等號時w(u,v)是最短路上的邊。

應用差分約束系統

非dag上dp

一般使用spfa或者縮點後dp

應為dijkstra有貪心策略的限制

將所有點入隊,且\(d_i=0\)

負環只看不等約束,不看初始值

演算法bellman-ford 常數小

spfa 判斷 1. 入隊次數》=n 2.最短路長度》=n

spfa-dfs 沒多大意思,輕鬆被卡

應用01分數規劃

**見最後

舊和最短路的線性規劃形式類似的一類線性規劃問題

也是需要初值的,對應d[s]=0

最短路最大化

有負環則無解

圖不連通 無關 任意解

最長路最小化

有正環則無解

圖不連通 無關 任意解

當然也可以轉化成最短路

判負環的**

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

const int n = 2005, m = 3005;

inline int read()

while(c>='0' && c<='9')

return x * f;

}int n, m;

struct edge e[m<<1];

int cnt, h[n];

inline void ins(int u, int v, int w) ; h[u] = cnt;

}int d[n], cou[n];

bool bellman_ford()

} }return true;

}int main()

puts(bellman_ford() ? "n0" : "ye5");

}}

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

const int n = 2005, m = 3005;

inline int read()

while(c>='0' && c<='9')

return x * f;

}int n, m;

struct edge e[m<<1];

int cnt, h[n];

inline void ins(int u, int v, int w) ; h[u] = cnt;

}int d[n], cou[n], inq[n], cinq[n];

int q[n], head, tail;

inline void lop(int &x)

bool spfa()

}} }

return true;

}int main()

puts(spfa() ? "n0" : "ye5");

}}

關於最短路 負環 差分約束系統的一點筆記

可以 沒有環,最多 v 1 條邊 有負環則不存在最短路 會形成最短路徑樹 演算法dijkstra 貪心,當 d u 是最小時要滿足之後 d u 不會更小,不能處理負權邊 bellman ford 迭代n 1輪,用邊鬆弛 spfa 佇列優化的bellman ford 最短路的線性規劃形式 最大化 d ...

負環與差分約束

跑 spfa 時,設 sp cnt x 表示從 x 入隊次數,若更新時,sp cnt y gt n 則說明圖中有負環,演算法正常結束,則圖中無負環 bool spfa return false 差分約束系統即為 n 元一次不等式組,每個約束條件都是由兩個變數作差構成的,形如 x i x i leqs...

差分約束系統及判斷負環

簡介 背景是給你若干個不等式,形如xi xj bxi xj b,需要你判斷x的解的存在性或是最優解。而差分約束系統即為這個問題轉化為乙個圖論問題,進而跑最短路來判環或求最值距離 最優解 這裡轉化的原理是三角不等式,即d v d u cost u,v d v d u cost u,v 可以建為一條花費...