什麼是差分約束:
它旨在解決不等式組求最值的問題。
就是給你一組不等式,詢問你某兩個變數之間的最大值or最小值
eg:給定n個變數和m個不等式,每個不等式形如 x[i] - x[j] <= a[k] (1<=i,j<=n, 1<=k<=m,a[k]已知),求 x[n] - x[1] 的最大值
例 n=4,m=5 不等式組如下圖
我們可以兩兩相加得到幾個 x[4]-x[1] 的式子
1. (3) x4 - x1 <= 8
2. (2) + (5) x4 - x1 <= 9
3. (1) + (4) + (5) x4 - x1 <= 7
發現 min就是我們所要求的的 x4-x1 的最大值
差分約束中求最小值用≥
,跑最長路;求最大值用≤
,跑最短路
例題:n個人編號為1-n,並且按照編號順序排成一條直線,任何兩個人的位置不重合,然後給定一些約束條件。
x(x <= 100000)組約束ax bx cx(1 <= ax < bx <= n),表示ax和bx的距離不能大於cx。
y(y <= 100000)組約束ay by cy(1 <= ay < by <= n),表示ay和by的距離不能小於cy。
如果這樣的排列存在,輸出1-n這兩個人的最長可能距離,如果不存在,輸出-1,如果無限長輸出-2。
解:令第x個人的位置為d[x](不妨設d[x]為x的遞增函式,即隨著x的增大,d[x]的位置朝著x正方向延伸)。
那麼我們可以列出一些約束條件如下:
1、對於所有的ax bx cx,有 d[bx] - d[ax] <= cx;
2、對於所有的ay by cy,有 d[by] - d[ay] >= cy;
3、然後根據我們的設定,有 d[x] >= d[x-1] + 1 (1 < x <= n) (這個條件是表示任何兩個人的位置不重合)
而我們需要求的是d[n] - d[1]的最大值,即表示成d[n] - d[1] <= t,要求的就是這個t
於是我們將所有的不等式都轉化成d[x] - d[y] <= z的形式,如下:
1、d[bx] - d[ax] <= cx
2、d[ay] - d[by] <= -cy
3、d[x-1] - d[x] <= -1
對於d[x] - d[y] <= z,令z = w(y, x),那麼有 d[x] <= d[y] + w(y, x),所以當d[x] > d[y] + w(y, x),我們需要更新d[x]的值,
這對應了最短路的鬆弛操作,於是問題轉化成了求1到n的最短路。
對於所有滿足d[x] - d[y] <= z的不等式,從y向x建立一條權值為z的有向邊。
然後從起點1出發,利用spfa求到各個點的最短路,如果1到n不可達,說明最短路(即上文中的t)無限長,輸出-2。
如果某個點進入佇列大於等於n次,則必定存在一條負環,即沒有最短路,輸出-1。否則t就等於1到n的最短路。
差分約束 知識點
知識點 詳解 一 點我 簡單的 差分約束 如果是求解 d st d ed 的最大值 就要將所有的約束條件都轉化為 d x d y z 的形式 然後建圖求最短路 如果是求解 d st d ed 的最小值 就要將所有的約束條件轉戶為 d x d y z 的形式,然後建圖,求最長路。不等式標準化 如果給出...
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...