差分約束詳解 洛谷SCOI2011糖果題解

2022-01-12 08:20:59 字數 1627 閱讀 1489

差分約束系統:

如果乙個系統由n個變數和m個約束條件組成,形成m個形如ai-aj≤k的不等式(i,j∈[1,n],k為常數),則稱其為差分約束系統(system of difference constraints)。亦即,差分約束系統是求解關於一組變數的特殊不等式組的方法。

——度娘。

然而並沒有看懂。。

通俗來說,滿足差分約束的條件是題目中給了你多個ai-aj<=(>=,之類)的條件,要求同時滿足這些條件並求極值的問題。

內麼,怎麼同時滿足這些問題呢?

假如我們以這個東西為例:

a2=0)

那麼,我們可以用圖來描述這個問題:

我們設有向邊(u,v),邊權為1表示u>v。因為u>v等價於u-1>=v,也就是u-v>=1,那麼我們就將(u,v),權值i理解為u-v=i。

畫出來圖長這樣:

要滿足所有條件且最小,也就是滿足a1-a2=1,a1-a3+(a3-a2)=2。

取最大的那個。

在圖上表示,就(莫名其妙的)變成了求最長路!

很神奇吧qwq。

也就是說,如果你想滿足所有條件,就先建圖,然後根據題目情況(最短路求得未知數最大,最長路求得未知數最小)來跑最長/短路。

例題:scoi2011糖果:

跑最長路qwq:

code:

#include#include

#include

#include

#include

using

namespace

std;

int n,k,x,a,b,sum=0,head[200002],cnt[200002],dis[200002

];long

long ans=0

;queue

q;bool vis[200002

];inline

intread()

struct

edgeedg[

210001

];inline

void add(int

from,int to,int

dis)

intmain()

if(x==2

) add(a,b,1);

}if(x==3

)

if(x==4

) add(b,a,1);

}if(x==5

) }

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

); vis[

0]=1;q.push(0

);

while(!q.empty())

cnt[now]++;

for(int i=head[now];i;i=edg[i].next)}}

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

printf(

"%lld\n

",ans);

}

完結qwq

洛谷 P5960 模板 差分約束演算法(差分約束)

題目中x1 x 1 y1可以轉變為 x1 x 1 y1 換一下字母更顯然易見 dis v dis u edge i w 那麼便可以轉換成圖上的最短路問題 解集 因為題中並沒有說明是聯通圖,可以設乙個超級源點,然後向每個節點連一條邊權為0的邊,然後從0點開始做最短路。注意建邊是從x 1連向x1。ac ...

SCOI 糖果 差分約束 SPFA

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

差分約束詳解

一直不知道差分約束是什麼型別題目,最近在寫最短路問題就順帶看了下,原來就是給出一些形如x y b不等式的約束,問你是否滿足有解的問題 好神奇的是這類問題竟然可以轉換成圖論裡的最短路徑問題,下面開始詳細介紹下 比如給出三個不等式,b a k1,c b k2,c a k3,求出c a的最大值,我們可以把...