如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成 \(\leq\) 的形式,建圖後求最短路;
如果需要求的是兩個變數差的最小值,那麼需要將所有不等式轉化成 \(\geq\) 的形式,建圖後求最長路。
這是兩個最基本的規則(算是吧)。差分約束的精髓就在於建圖,而這玩意兒個人感覺沒什麼好辦法,只能靠不停做題去找到那種感覺,自己親自推一推式子,有些題的約束條件藏得很深甚至你看不出來這道題要用查分約束做(雖然我個人目前還沒敢挑戰這種題...),總而言之還是多做題吧...
給出一組包含 \(m\) 個不等式,有 \(n\) 個未知數的形如:
的不等式組,求任意一組滿足這個不等式組的解。
連式子都不用自己推,根據所給的條件直接建邊即可,給的式子是小於等於,所以求最大值跑最短路,看下面**:
(洛谷裡這道題是有spj的,所以如果答案跟樣例不一樣不要慌qwq,像是我這個**樣例跑出來就是0 -2 0 qwq)
#include #include #include #include #include using namespace std;
const int maxn = 5000 + 10;
#define ll long long
struct edgee[maxn << 2];
int head[maxn], len = 0;
void add(int u, int v, int w)
int n, m;
int dis[maxn], cnt[maxn];
bool vis[maxn];
int spfa(int u)
}} }
return 1;
}int main()
for(int i = 1; i <= n; i++)
if(spfa(0) == -1) printf("no\n");
else for(int i = 1; i <= n; i++) printf("%d ", dis[i]);
puts("\n");
return 0;
}
差分約束模板
如果乙個系統由 n 個變數和 m 個約束條件組成,其中每個約束條件形如 x i x j c k 其中 c k 是常數 可以是負數,也可以是非負數 則稱其為差分約束系統。我們要解決的問題是 求一組解 x 1 a 1,x 2 a 2,x n a n 使得所有的約束條件得到滿足,否則判斷無解。差分約束系統...
差分約束及其模板
關於差分約束,演算法導論 講的挺明白的了。有一點要注意的是x1 x2 w在圖上對應的是x2 x1的邊權為w的一條邊,而不是x1 x2,這一點不要搞糊塗了。以下是我的差分約束的模板,解決的是 演算法導論 上的例子 include include include using namespace std ...
差分約束系統 模板
差分約束系統 如果乙個系統由n個變數和m個約束條件組成,其中每個約束條件形如 xj xi bk i j 1,n k 1,m 則稱其為差分約束系統。例如如下的約束條件 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 全都是...