「可以」沒有環,最多\(|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 可以建為一條花費...