轉載請註明原文連接:http://www.cnblogs.com/LadyLex/p/7601119.html html
彷佛本身以前整理過一點點網絡流的東西網絡
可是最近看了幾道題目以後發現本身仍是太菜了數據結構
那麼讓咱們繼續整理吧!下面是我目前所學,不按期更新!ide
若是對於點有必定的限制,或者咱們的問題中還涉及了時間,函數
咱們能夠考慮拆點來解決,好比某個點的通過次數,或者時間的分層圖,學習
或者把1個點拆成n個,用最小割來表示選擇……均可以經過拆點連邊來表示限制條件.優化
精度要求不高的實數流能夠經過放縮的方式計算,即乘以大倍率再除去idea
見到棋盤先來一套黑白染色冷靜一下就行了spa
棋盤題千萬不要忘記黑白染色!code
彷佛2-sat也能夠這麼玩
舉個最簡單的例子:若是咱們的邊是對某個區間裏面的每一個點都要聯邊,
咱們就能夠建個線段樹,向對應區間聯邊,線段樹節點之間再聯邊,
這樣就可讓邊數從$n^{2}$變成$nlogn$
彷佛2-sat也能夠這麼玩
在某些狀況下,可能一系列元素中只能選取一個
那在2-sat裏面,點從「x爲真/假」變成了「前x個爲真/假」
網絡流裏面也能夠相似進行操做,
咱們就不用從這個點向每一個點都聯邊了,一串inf連下去便可
這個多見於最小割/最大權閉合子圖中
咱們的inf邊能夠表明「二者只能選擇一個」,即割掉二者中的一個,
或者「選擇a必須選擇b」,而後用到最大權閉合子圖裏面
若是對於某條邊,其費用是關於流量的一個函數,而且知足他斜率是單調增長的,咱們就能夠拆邊,第x條費用設爲$f(x)-f(x-1)$
這樣因爲咱們跑最小費用,每次就會找最小的,流了x時就能正好計算了對應的f(x)
彷佛一個不錯的建模方法是先建個暴力圖,而後看看能不能減小其中的點來優化咱們的圖
規律1. 若是幾個結點的流量的來源徹底相同,則能夠把它們合併成一個。
規律2. 若是幾個結點的流量的去向徹底相同,則能夠把它們合併成一個。
規律3. 若是從點u到點v有一條容量爲∞的邊,而且點v除了點u之外沒有別的流量來源,則能夠把這兩個結點合併成一個。
這個……我不是很會
平面圖的最小割就對應了對偶圖的最短路
轉對偶通常使用對象仍是網格圖,或者有特殊結構的圖(看題),
總之要求能夠很容易的給每一個聯通塊編號,而且能用什麼東西表明它
一開始我覺得這東西就是個狼抓兔子
最後發現事情不太對……平面圖轉對偶圖不只僅這麼簡單
因爲最短路的複雜度通常是比網絡流優秀的
因此……若是一張圖能夠轉對偶,原來的解法邊點又不少,那麼咱們不妨試試轉對偶
??????
不會!留坑待填!
這種題以前見過兩道,都是很是裸的那種
通常都是說「要用迴路覆蓋整個網絡」,而後咱們限制每一個點度數必須爲2
但是……今天見了個新題
若是每一個點能夠選進迴路能夠不選,每種連邊方式有權值,而後要求最大權呢?
怎麼感受這兩個都這麼像插頭DP啊23333
考慮使用費用流,咱們固然先黑白染色
而後……咱們能夠把迴路原來的邊肯定一個方向,好比說縱向邊必須黑連白,橫向必須白連黑
這樣咱們把每一個點拆爲2點x1和x2,連$S-->x1-->x2-->T$,流量爲1費用爲0
這條x1-->x2的邊表明不選
而後咱們把原圖中有向邊對應的x1連向y2,流量1,費用爲對應費用
這樣若是有一個x1-->y2被流了,x2和y1就都須要另一個來流它
因爲咱們跑的費用流的前提是最大流,所以這樣咱們求出來的解不會存在某個點度數不合法的狀況
這樣非常妙啊……考場上沒有想到拆點處理
bzoj1711 bzoj1458 bzoj3993
bzoj2095最大流求混合圖歐拉回路
這個問題的作法算一個小idea:咱們能夠用流量來表示「需求量/改變量」等值,
而後經過是否滿流來判是否存在合法分配方案
也就是說一張圖最大流等於最小割。
感性理解一下的話……你想,最大流是小於等於割的……
你一個最大流拍上去,S到T就已經不存在通路了……
咱們須要考慮兩個東西:一條邊可不可能在最小割中,和一條邊一不必定在最小割中
在你跑完一遍最小割以後,在割集上的邊是必定滿流的
咱們給殘量網絡跑tarjan縮點,若是一條邊可能在最小割中,那麼它的兩端點不在同一個聯通塊裏;
若是一條邊必定在最小割中,那麼其(原圖上)的起點會和S在一個聯通塊裏,終點會和T在一個聯通塊裏。
最多見的模型是「每一個決策有多種選擇,咱們選擇其中的一個」這種問題
最小割中的「割掉」就表明了「選擇/不選擇」
這個表明選擇仍是不選擇看你最後要最大仍是最小……
若是要最大,咱們一開始先累加sum,再減去最小割
由於建圖以後若是有流量就證實存在衝突,
沒有流量的時候咱們就用最小的代價消除了全部的衝突
若是咱們要最小,那就直接流,割掉的就是選擇的
但有的時候也可能會出現有三種或者更多種狀況,咱們只能選擇其中之一
這也好說:咱們建一串點,這裏面最小的一個就會被割掉
若是點對之間的貢獻不只僅是點權,還有些附加條件(同時選,同時不選,一個選一個不選,blabla……)
咱們手動構造一下,因爲「 最小割中的「割掉」就表明了「選擇」 」
咱們就討論一下全部選擇狀況,使對應狀況下被割掉的邊流量之和等於權值
這彷佛被稱做「文理分科模型」
這是一種經典模型……因Hnoi的切糕一題得名「切糕模型」
咱們會有每一個元素有多種選擇,相鄰兩個元素之間的選擇會相互限制。
好比切糕一題限制相鄰兩個點選擇元素的下標不超過D
這時,咱們從每一個下標x向下標x-D連一條inf的邊
若是相鄰兩個元素的距離超過D,那麼必然會因爲inf邊的存在而存在其餘通路,
致使咱們割掉權值更大的邊
可是切糕模型不只僅能夠這樣用
好比ctst2009的移民站選址,這題的模型就很是不錯
被稱爲切糕改23333
如今至關於每一個點有m種選擇,每種選擇有花費,
可是不一樣點(好比i,j)的不一樣選擇還會產生選擇的標號差($|pi-pj|$)*特定常數($b(i,j)$)的花費
這樣咱們把任意兩個點的相同選擇之間加上一條$b(i,j)$的雙向邊,
若是i割掉了pi,j割掉了pj,那麼這倆之間會出現$|pi-pj|$條流量爲$b(i,j)$的邊
若是最終選擇就是pi和pj,那麼這$|pi-pj$|條邊都會滿流
這樣就知足了題給模型
這樣的確是很666的,咱們經過利用最小割的性質(不存在通路),
而且利用題給條件的特色(pi-pj)來考慮一種建模的改造:爲限制距離的邊加上權值
總之挺神的……這題也不知道出題人怎麼想出來的
還有一種狀況:和最短路有關的選擇問題:即每一個點到1最短路長度不一樣不一樣有不一樣收益
這樣的話,咱們就把距離限制當作邊,對於原圖邊$u->v$,咱們轉化爲限制$|d_{u}-d{v}|<=1$
而後開始跑就好了
再來一個小問題:若是如今在網格圖上,不是限制相鄰兩個的差不超過定值,而是限制和不超過定值呢?
那麼咱們黑白染色,黑點建決策鏈從1到n,白點從n到1,這樣的話就能夠用以前差的連邊方式處理和了。
把原來的權值x變成maxn-x,maxn爲一個大於所有x的值,
這樣割掉的最小邊就是原來的最大值了,而後就能夠了。這樣建圖的確很巧。
把一開始的流量設置爲收益+損耗,累加的時候只加收益
這樣的話,咱們若是最後的決策是損耗,答案就會貢獻「收益-(收益+損耗)」= -損耗
---over----
bzoj1001 bzoj1797 bzoj3144 bzoj3218
bzoj1497 bzoj3996 bzoj2756 bzoj2127
bzoj2039 bzoj3774
---waiting---
bzoj4519 bzoj4435 bzoj2229 bzoj3681
codeforces793G bzoj4957
最多見的最大權閉合子圖只是在最小割的基礎上用inf邊添加一些限制條件便可
有的時候,最大權閉合子圖作着作着會變成最小割
也就是說,若是咱們如今不是說「選x必須選y」,
而是「咱們能夠選z以後選y,也能夠選x以後選y」
歸納的說就是當咱們用最大權閉合子圖處理「或「的條件的時候
樸素的作法行不通了
這時候,咱們能夠考慮全部可能的狀況,而後把他們串到一塊兒跑最小割。
而且串到一塊兒的順序也是有講究的……不能串亂了
---over----
bzoj1565 bzoj4873 bzoj4501 bzoj3438
bzoj3232
(聽說這些都是用線性規劃推出來的......我並不會)
模型之一是k覆蓋問題,給出一些帶權區間,權值爲a要求選出一部分使得每一個數最多被k個區間覆蓋而且所選區間權值和最大
先把序列用流量爲k的邊串起來(S->1->2->3.......->n->T這樣),這樣限制了通過次數k
接着爲了選權值最大,咱們由每一個區間的左端點l向右端點右側(r+1)連流量爲1,權值爲ai,而後跑一個最大費用最大流便可
因爲咱們跑的費用流創建在最大流的基礎上,所以每一個點被覆蓋的次數不會超過k次,不然就會在後續增廣時反悔
還有一個類似的模型是每一個點有權值a,每一個長度爲m的區間最多能選k個,要求所選點權最大
一樣把序列串起來,而後對於每一個點i向它後方第m+1個點連流量爲1,費用爲ai的邊,一樣跑一個最大費用最大流
感性理解和上面那種建模相似,可是具體證實須要線性規劃的知識......
好吧我在這裏寫了寫不用線性規劃的理解方式……想看能夠看一看
其實這種模型能夠歸納爲一類」核糖體+tRNA「模型(名字我本身起的233)
也就是說,那個長度爲m的區間就是移動的核糖體,咱們從原點放出來k個tRNA(流量),
而後對於每個長度爲m的操做區間,每一個tRNA都只能操做一次
這個操做的體現就是流經咱們上面加的那個跳躍的邊……而後他會跳到m個單位長度以後,那是第一個不包含它的區間
而後在下面咱們連一溜點,流量體現了咱們對」不進行操做「的限制,即限制一段區間只能有一些tRNA不進行操做
也就是說 咱們經過下面的流量逼着tRNA去走上面的邊
而後大概就能夠了,這樣咱們就能跑出來對應的限制
固然,若是咱們用線性規劃的話,咱們能夠用把等式差分的方法來解決,不在這裏討論了。
---over----
bzoj1877 bzoj2548 bzoj3876 bzoj2324
bzoj2055 bzoj1070 bzoj4514 bzoj3171
bzoj2879 bzoj3550 bzoj1283 codechef_SEP12_PARADE
不用說話,本身體會:http://www.cnblogs.com/liu-runda/p/6262832.html
---over----
bzoj3876 bzoj2055 bzoj2502 bzoj4200 bzoj4213
線性規劃在網絡流問題中的應用非常普遍,
由於網絡流問題能夠把每一個點/每條邊的流入流出量看做變量,把最終答案看做目標函數來解決.
這一部分的知識屬於根本性的解決問題方法,掌握這種建模技巧確定比背建模套路管用
如今我暫時沒有時間去學習這方面的知識......聯賽以後這個坑必定要補上的.
我回來補坑了
線性規劃和網絡流的使用和上下界其實長得差很少……
咱們考慮,設$x_{i}$爲每一個變量是否選擇,那麼大概會有一串柿子像這樣:
$\sum x_{j}>=A_{i}$
首先咱們轉成等式……
$\sum x_{j}==y_{i}+A_{i}$
咱們加入2個等式$0==0$把這些等式差分
$\sum x_{j}-\sum x_{k}==y_{i}+A_{i}-y_{i+1}-A_{i+1}$
$\sum x_{j}-\sum x_{k}+y_{i+1}-y_{i}+A_{i+1}-A_{i}==0$
而後……這個柿子的本質是流量平衡,減(-)表明流出,加(+)表明流入
咱們發現這個東西就是一堆常數項加上一堆變量對吧
而後對於全部的元素 咱們都知足一個原則:入正出負
若是兩個柿子有相同的變量,那麼從負的那個(出)向正的那個(入)連邊(輔助變量也算,連inf)
而後若是一個常量x是正的,就由s向它連x;不然它向t連-x
如今咱們至關於要求一個可行流
對於常量,咱們創建附加源點和匯點,依然遵循入正出負連邊
有一種不用動腦子的記憶方法是移項到每一個前面都是正的,而後一側有變量表明出邊,一側表明入邊
而後對於附加源匯跑你想跑的流………
上面費用流那個序列限制建模也能夠用線性規劃來理解
---over----
bzoj1061 bzoj4842
不清楚分類的題目:
bzoj2095 bzoj4213 bzoj4067
loj6045 loj2006 loj536 bzoj2229
uoj217 uoj168 uoj77 bzoj2597