藍書3 4 差分約束系統

2022-06-01 04:21:07 字數 2697 閱讀 3653

t1 糖果 bzoj 2330

題目大意:

幼兒園裡有n

個小朋友,

給這些小朋友們分配糖果,要求每個小朋友都要分到糖果 每個小朋友會提出一些要求

k行 每行輸入三個數x a b

如果x=1

, 表示第

a個小朋友分到的糖果必須和第

b個小朋友分到的糖果一樣多

如果x=2

, 表示第a

個小朋友分到的糖果必須少於第

b個小朋友分到的糖果

如果x=3

, 表示第a

個小朋友分到的糖果必須不少於第

b個小朋友分到的糖果

如果x=4

, 表示第a

個小朋友分到的糖果必須多於第

b個小朋友分到的糖果

如果x=5

, 表示第a

個小朋友分到的糖果必須不多於第

b個小朋友分到的糖果

思路:一道裸題

對於x=1的情況 在a b之間連無向邊權值為0

x=2和x=4 在從a->b||b->a連有向邊權值為1

x=3和x=5 在從b->a||a->b連有向邊權值為0

如果有正環輸出-1 開始的時候將所有點都放到佇列裡

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

#define inf 2147483647

10#define ll long long

11#define maxn 100100

12#define eps 1e-9

13using

namespace

std;

14 inline int

read()

1518

while(isdigit(ch))

19return x*f;20}

21int n,m,q[maxn<<4],l=1

,r,f,st,inq[maxn],num[maxn];

22ll ans;

23int to[maxn<<1],nxt[maxn<<1],fst[maxn],dis[maxn],val[maxn<<1

],cnt;

24void add(int u,int v,int w)

25int

spfa()

2638}39

return1;

40}41int

main()

4248

if(c==2) if(a!=b) add(a,b,1);else

49if(c==3) add(b,a,0

);50

if(c==4) if(a!=b) add(b,a,1);else

51if(c==5) add(a,b,0

);52}53

for(int i=1;i<=n;i++) dis[i]=1,inq[i]=1,num[i]=1,q[++r]=i;

54if(!spfa())

55for(int i=1;i<=n;i++) ans+=dis[i];

56 printf("

%lld

",ans);57}

58

view code

t2 layout bzoj 1731

題目大意:

數軸上放一些點 按順序放n個點

有一些條件為 點a與點b的距離不大於或不小於乙個距離c

思路:還是裸題 

因為按順序放

所以不小於的情況就從a->b連權值為c的邊 不大於的情況從b->a連權值為-c的邊

判負環

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

#define inf 2139062143

10#define ll long long

11#define maxn 100100

12#define eps 1e-9

13using

namespace

std;

14 inline int

read()

1518

while(isdigit(ch))

19return x*f;20}

21int n,m1,m2,q[maxn<<4],l=1

,r,f,st,inq[maxn],num[maxn];

22ll ans;

23int to[maxn<<1],nxt[maxn<<1],fst[maxn],dis[maxn],val[maxn<<1

],cnt;

24void add(int u,int v,int w)

25ll spfa()

2638}39

if(dis[n]==inf) return -2;40

return

dis[n];41}

42int

main()

4346

while(m2--)

47 memset(dis,127,sizeof

(dis));

48 printf("

%lld

",spfa());

49 }

view code

差分約束系統

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

差分約束系統

差分約束系統 對於差分不等式,a b c 建一條 b 到 a 的權值為 c 的邊,求的是最短路,得到的是最大值 對於不等式 a b c 建一條 b 到 a 的權值為 c 的邊,求的是最長路,得到的是最小值 存在負環的話是無解 求不出最短路 dist 沒有得到更新 的話是任意解 第三 一種建圖方法 設...

差分約束系統

差分約束系統 x1 x2 0 x1 x5 1 x2 x5 1 x3 x1 5 x4 x1 4 x4 x3 1 x5 x3 3 x5 x4 3 不等式組 1 全都是兩個未知數的差小於等於某個常數 大於等於也可以,因為左右乘以 1就可以化成小於等於 這樣的不等式組就稱作差分約束系統。這個不等式組要麼無解...