la4255 Guess 差分約束

2021-07-08 10:22:41 字數 1642 閱讀 2082

這道題目我的做法是差分約束,具體地,設s[i]表示1..i的乙個字首和,那麼對於輸入的a[x][y],

如果a[x][y]='+',說明s[y]比s[x-1]要大,s[y]>s[x-1] s[y]-s[x-1]>=1,所以從x-1到y連一條長度為1的邊

如果a[x][y]='-',說明s[y]比s[x-1]要大,s[y]=1,所以從y到x-1連一條長度為1的邊

如果a[x][y]='0',說明s[y]和s[x-1]一樣大,s[y]=s[x-1] s[y]-s[x-1]=0,所以從x-1到y連一條長度為0的邊。雖然是等號而不是不等號,但是如果s[y]<>s[x-1],則會出現正權迴路,和題設矛盾。

這樣建完圖後,跑一遍最長路,求出s後,原始序列就顯而易見了。

下附ac**:

const

mo=100;

var a:array[-1..15,-1..15] of longint;

d:array[-1..100] of longint;

h:array[0..100] of longint;

bo:array[-1..100] of boolean;

s:string;

n,tt,i,j,k,head,tail,u:longint;

begin

readln(tt);

while tt>0 do

begin

tt:=tt-1;

readln(n);

readln(s);

k:=0;

fillchar(a,sizeof(a),200);

for i:=1 to n do

for j:=i to n do

begin

k:=k+1;

case s[k] of

'+':a[i-1,j]:=1;

'-':a[j,i-1]:=1;

'0':a[i-1,j]:=0;

end;

end;

fillchar(d,sizeof(d),200); d[-1]:=0;

fillchar(bo,sizeof(bo),true);

for i:=0 to n do

a[-1,i]:=0;

head:=0; tail:=1; h[1]:=-1;

while head-1000000 then

if d[u]+a[u,i]>d[i] then

begin

d[i]:=d[u]+a[u,i];

if bo[i] then

begin

tail:=tail mod mo+1;

h[tail]:=i; bo[i]:=false;

end;

end;

end;

for i:=1 to n-1 do write(d[i]-d[i-1],' '); writeln(d[n]-d[n-1]);

end;

end.

2015.2.11

by lych

POJ3169差分約束 SPFA 差分約束

思路 假設i j 兩隻奶牛可以站在同乙個位置,但是必須公升序排列,所以有差分約束方程d i d i 1 0 對於兩隻有好感的奶牛有差分約束方程d j d i k 對於兩隻反感的奶牛有差分約束方程d i d j k 有了約束方程就可以spfa include include include inclu...

分糖果 差分約束

description 幼兒園裡有n 個小朋友,lxhgww 老師現在想要給這些小朋友們分配糖果,要求每個小朋友都要分到糖果。但是小朋友們也有嫉妒心,總是會提出一些要求,比如小明不希望小紅分到的糖果比他的多,於是在分配糖果的時候,lxhgww 需要滿足小朋友們的 k個要求。幼兒園的糖果總是有限的,l...

差分約束系統

差分約束 若 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 ...