差分約束系統 POJ 1364

2021-06-21 02:21:49 字數 2599 閱讀 8811

參考:

.html

所謂查分約束系統其實很簡單,就是全都是兩個未知數的差小於等於某個常數(大於等於

也可以,因為左右乘以-1就可以化成小於等於)的一系列方程組(ax《=p,a=1或-1)。如:

x1 - x2 <= 0

x1 - x5 <= -1

x2 - x5 <= 3

x3 - x2 <= 5

x4 - x3<= 4

x4 - x3 <= -12

x5 - x1 <= -23

x5 - x4 <= -3

這樣的不等式組就稱作差分約束系統。

這個不等式組要麼無解,要麼就有無陣列解。因為如果有一組解

的話,那麼對於任何乙個常數k,肯定也是一組解,因

為任何兩個數同時加乙個數或減去乙個數之後,它們的差是不變的。

差分約束系統,就是求出滿足簡單線性不等式組xj-xi<=bk的解。而我們在求這個問題時

可以將他轉化為圖問題來解決,將各個未知數看成圖的頂點,而右邊的常數看成兩個頂點

的邊權值,比如:將xi-xj<=k轉換為xi<=xj+k,看成xj指向xi的有向邊,權值為k,這樣求

方程組的解就相當於求各個頂點到源點的最短距離,而**來的源點?

很簡單,我們加上乙個點作為源點,並且為了始源點能夠到達每乙個頂點,將源點和頂點

間的距離設為某個常數如0。並且只有圖中存在負權環時,方程組才無解,否則一定有解。

而對可以判斷圖是否有負權環且可以求單源最短距離演算法中首選bellman-ford。這樣查分約束

系統問題就解決了。當然有個問題那就是查分約束系統不可以求解<(>)的問題,所以我們必須

將其轉化為<=(>=)的問題。

題目大意就是:

給定乙個序列的長度,然後給定若干關係:這個關係是子串行各個元素之和與某個給定整數的大小關係。要求是否存在這樣乙個序列滿足所有給定的若干關係。

本題主要就是需要想到利用前n個元素的和為替代,即設s[i] = a[1] + a[2] + …a[i]。

則a[si] + a[si+1] + … + a[si + ni] = s[si + ni] - s[si - 1];所以如果a[si] + a[si+1] + … + a[si + ni] < k 則 s[si + ni] - s[si - 1] < k <= k - 1;如果a[si] + a[si+1] + … + a[si + ni] > k 則 s[si - 1] - s[si + ni] < -k <= -k - 1;

下面就是查分約束系統了。

a:spfa

#include

#include

#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=20002;

const int maxm=1000009;

const int inf=999999999;

int n,m;

struct edge

edge[1003];

int first[203];

int e;

void addedge(int u,int v,int w)

int s[203];

int vis[203];

int cnt[203];

int d[203];

int top;

bool spfa()

//建立無窮源點n+1,若是非聯通圖可使之成為聯通圖

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

s[++top]=n+1;

d[n+1]=0;

while(top>-1) }}

}return true; }

int main()

if(!spfa())

else

} }

b:bellman-ford

#include

#include

#include

#include

#include

#include

#include

using namespace std;

#define maxn 120

#define nil 0x7fffffff/2

struct egde

e[maxn];

int d[maxn];

bool bell_ford (int n, int m)

} for(i=0; i

return 1; }

int main()

for(i=1, k=m; i<=n+1; i++, k++)

e[k].u = 0, e[k].s = i, e[k].d = 0;

bool ans = bell_ford (n+1, m+n+1);

if(ans)

printf("lamentable kingdom\n");

else

printf("successful conspiracy\n");

}return 0; }

POJ 1364(差分約束系統)

poj 1364 1 題意 有乙個序列長度為n,給出m次的約數,詢問這m次限定能否確定乙個序列。輸入n,m 然後m行,每行有四個引數si,ni,oi,ki 如果oi是gt就是 否則是 如果最後能確定乙個序列就輸出 lamentable kingdom 否則輸出 successful conspira...

poj1364(差分約束系統)

poj1364 設s i 表示a1 a2 a i 1 的和 給我們n個點,m條約束 如果是a b gt c 那麼表示 s a b 1 s a c s a s a b 1 c c 1 s a s a b 1 c 1 如果是a b lt c 那麼表示 s a b 1 s a c s a b 1 s a ...

POJ 1364 差分約束

解題的思路比較奇葩。第一次見到啊,也不知道別人是怎麼看出來這種情況下就是差分約束也就是可以用到圖論,表示真的好迷啊。看來對差分約束的概念還很差呢。include include include include includeusing namespace std const int maxn 100...