差分約束系統:
如果乙個系統由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完結qwq#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);
}
洛谷 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的最大值,我們可以把...