差分約束 模板

2022-03-24 19:05:22 字數 1081 閱讀 6478

如果需要求的是兩個變數差的最大值,那麼需要將所有不等式轉變成 \(\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 全都是...