POJ1364 King 差分約束

2021-08-04 06:00:54 字數 1539 閱讀 5485

【鏈結】

poj1364

【題目大意】

給你n和m,以及m個約束條件,對於每個約束條件給出si,ni,oi,ki,求是否有乙個n個元素的序列a能滿足這些約束條件。其中oi可以分別表示為gt(>)和lt(<),約束條件的定義為as

i+as

i+1+

⋯+as

i+ni

>ki

或asi

+asi

+1+⋯

+asi

+ni。【解題報告】

了解題目大意後,就可以想到這題是差分約束。但是從題目表面上卻很難實現**。進一步思考可以發現對於as

i ~as

i+ni

的加和,我們可以用字首和求出,定義以su

m[x]

表示a1

~ax 的加和,所以as

i ~as

i+ni

的加和就是su

m[si

+ni]

−sum

[si−

1]。對於》和《的轉換推導如下: su

m[si

+ni]

−sum

[si−

1]-> su

m[si

+ni]

−sum

[si−

1]<=ki

−1 s

um[s

i+ni

]−su

m[si

−1]>ki

-> su

m[si

−1]−

sum[

si+n

i]<=−k

i−1

有了以上的推導,spfa判環就出解了。

ps:因為存在圖不完全連通的情況,所以可以加個超級源解決此類情況。

#include

#include

#include

using

namespace

std;

const

int maxn=105,maxm=205;

int n,m,st,tot,num[maxn],dst[maxn],que[maxn],lnk[maxn],son[maxm],nxt[maxm],w[maxm];

bool vis[maxn];

inline

int read()

void add(int x,int y,int z)

bool spfa()}}

return1;}

void work()

for (int i=0; i<=n; i++) add(st,i,0);

if (spfa()) printf("lamentable kingdom"); else

printf("successful conspiracy"); putchar(10);

n=read();

}int main()

poj 1364 King 差分約束

注意差分約束只能求 或 spfa判斷有無負權迴路。對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值。存在負環的話是無解,求不出最短路 dist 沒有得到更新 ...

poj 1364 King 差分約束

題目大意 有乙個序列。給定一些約束條件,格式為si ni oi ki,意思是序列中第si項到第si ni項的和 或 ki,oi表示 用 gt 表示 或 用 lt 表示 問這樣的序列是否存在。存在輸出 lamentable kingdomi 否則輸出 successful conspiracy 思路 ...

差分約束 poj 1364 King

大致題意 告訴你有一列長度為n的數列和m個關係式。每個關係式的表述為 si ni gt c 或者是 si ni lt c。分別代表該數列第si項一直加到第si ni項的和大於c,和第si項一直加到第si ni項的和小於c。求是否存在滿足以上m個要求的數列。是則輸出 lamentable kingdo...