約束條件 :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 #include9 #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...