zoj 3668 差分約束

2022-04-04 16:28:20 字數 1646 閱讀 5801

約束條件 :f[i]  表示前i塊石頭的能量總和。

f[r]-f[l-1]>=a  

f[r]-f[l-1]<=b

f[i]-f[i-1]<=10000

f[i]-f[i-1]>=-10000

關於為什麼是字典序。。。在網上看到如下:

總結了一下,差分約束系統有兩個解決方案:

1, 最短路模型。 所有的約束條件都是形如f(x)<=f(y)+b,b正負不分。這樣在有向圖中addedge(y, x, b)這條邊,這樣根據最短路求解的性質我們可以得到x的最短路值滿足了所有的f(x)<=f(yi)+bi,並且使得某個(某些)f(x)=f(yk)+bk。本來是f(x)<=f(yk)+bk的,現在都f(x)=f(yk)+bk了,因此利用最短路模型求出來的f值是最大值。

2,最長路模型。所有的約束條件都是形如f(x)>=f(y)+b,b正負不分。這樣在有向圖中addedge(y, x, b)這條邊,這樣根據最長路求解的性質我們可以得到x的最長路值滿足了所有的f(x)>=f(yi)+bi,並且使得某個(某些)f(x)=f(yk)+bk。本來是f(x)>=f(yk)+bk的,現在只是f(x)=f(yk)+bk了,因此利用最長路模型求出來的f值是最小值。

回歸到本題,所有值求是最大值,sum[0]和sum[n]確定的,於是可以得到是字典序最大。

ps:開始寫完後試著交了下。。。沒想到ac了。。

view code

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include

9 #include10 #include11 #include12 #include

13using

namespace

std;

14#define cl(x,v) memset(x,v,sizeof(x));

15const

int inf = 0x3f3f3f3f;16

const

int maxm = 2e5+5;17

const

int maxn = 1005;18

intn,m;

19struct

edge

2024 edge(int v,int

c):v(v),c(c){}

25};

26 vectore[maxn];

27int

dis[maxn],cnt[maxn];

28void addedge(int u,int v,int

c)29

32bool relax(int u,int v,int

c)33

39return

false;40

}41bool spfa(int

src)

4259}60

}61return

true;62

}63intmain()

6477

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

7882

if(!spfa(0)) puts("

the spacecraft is broken!");

83else

8491}92

return0;

93 }

zoj 3668 差分約束

題意 給定l,r a,b 表示序列從l到r的和 a b。並輸出序列最大的取值,誤解輸出 the spacecraft is broken 查分約束 u v 建條邊 則有dis v dis u w u,v 即dis v dis u w u,v sum r 表示0到r的和。則sum r sum l 1 ...

ZOJ1455差分約束

這題做了之後發現自己對差分約束好像終於懂了一點,開始看了roll神的做最長路才a掉 後來自己想了老半天想出來了最短路怎麼寫 最長路版 include include include include include include include include include include inc...

zoj4028(差分約束)

題意 給你以i為結尾的最長上公升子串行的值,和每個值的區間範圍求可行的a i 題解 差分約束,首先滿足l i a i r i 可以建乙個虛擬節點n 1,那麼有a n 1 a i l i a i a n 1 r i 同時當 f i f j i include include include inclu...