差分約束系統

2021-10-05 10:20:43 字數 4368 閱讀 6475

簡介

差分約束系統(system of difference constraints),是求解關於一組變數的特殊不等式組之方法。

如何乙個系統由n個變數和m個約束條件組成, 其中每個約束條件形如

x[i] - x[j] <= d (i, j ∈ [1, n], t ∈ [1, m]), 則稱其為差分約束系統。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。

如果x[i] - x[j] <= d, 那麼從 j 到 i 鏈結一條長度為d的邊。那麼就是求最短路。

如果x[i] - x[j] >= d, 那麼從 j 到 i 鏈結一條長度為d的邊。那麼就是求最長路。

判斷有無解

判斷圖有沒有負環即可,如果發現了負環,說明找到了矛盾。

用spfa判負環

123

4567

891011

1213

1415

1617

1819

2021

bool spfa(int s) }}

return 1;

}

dfs判負環

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

28

inline bool spfa(int u)

dis[v] = dis[u] + w;

if (!spfa(v)) }}

vis[u] = 0;

return 1;

}int main()

}cout << "yes\n";

}

例題 1. [scoi2011]糖果

題目鏈結

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-8

#define ms(i, val) memset(i, val, sizeof i)

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairp;

const int n = 3e5 + 5;

const int m = 3e6 + 5;

const int inf = 0x3f3f3f3f;

const ll ll_max = 4557430888798830399;

inline int read()

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

return f ? (~ res + 1) : res;

}struct edge ed[m];

int cnt, n, m, head[n], tim[n];

ll dis[n];

bool vis[n];

void init()

inline void add(int u, int v, ll w) ;

head[u] = cnt++;}

dequeq;

inline bool spfa(int u)}}

return 1;}

int main()

for (int i = n; i >= 1; --i)

ll ans = 0;

if (spfa(0))

cout << ans << "\n";

}else cout << "-1\n";

return 0;

}

例題2. hdu3666. the matrix problem

題目鏈結

隱藏比較深的差分約束了。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define eps 1e-8

using namespace std;

typedef long long ll;

typedef unsigned long long ull;

typedef pairp;

const int n = 1001;

const int inf = 0x3f3f3f3f;

const ll ll_max = 4557430888798830399;

struct edge ed[340444];

int cnt, n, m, head[n], tim[n];

bool vis[n];

double dis[n];

queueq;

void init()

void add(int u, int v, double w)

int u, v;

bool spfa(int u)

if (!spfa(v))}}

vis[u] = 0;

return 1;

}double l, u, x;

int main()

}int flag = 1;

for (int i = 1; i <= n + m; ++i)

}if (flag)

puts("yes");

}return 0;

}

1

恰似你一低頭的溫柔,嬌弱水蓮花不勝寒風的嬌羞, 我的心為你悸動不休。  --mingfuyan

差分約束系統

差分約束 若 s a s b k 建一條b到a 的長度為k的邊 若s a s b k 建一條b到a 的長度為 k的邊 是求最小值的最長路 是求最大值的最短路 注意到最短路演算法的鬆弛操作 if d j d i w i j d j d i w i j 這其中的三角形不等式 d j d i w i j ...

差分約束系統

差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...

差分約束系統

差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...