網路流 總結

2022-03-26 20:19:17 字數 3274 閱讀 5405

有時候求最小花費可以轉化為總可能花費減掉最大可刪去花費(最大流),或者二分答案/二分某個權值最大流驗證。

考慮先假定最後棋盤上的數字再驗證。每次的操作是加加相鄰的格仔,所以可以把棋盤黑白染色,這樣操作一次給黑白色的數字總和都加了1,放在網路流上就是建二分圖,s到點到t建邊,增廣1流量即為操作一次,驗證最大流加上原總數是否等於假定數字之和。對於最終的數字,如果棋盤是奇×奇,列式子:$x*cnt0-sum0=x*cnt1-sum1$,可以解出$x$就是$sum0-sum1$。如果行列中有偶數,那麼在$x$滿足的情況下$x+1$也滿足(選相鄰格仔一定可以鋪滿),便可以二分$x$驗證。

注意x的值是可以大於原棋盤最大值的(反例易得),在這個地方卡了很長時間。

滿足條件是至少那麼多士兵,轉化為:先把所有可行士兵都選上,在把每行列能刪掉的士兵刪去,就是跑能刪士兵的最大流。

不知道下界費用流能不能跑。

總時間可以二分。對於每個門,同一時間限制只能過乙個人,那麼我們把乙個門按時間拆點,把每個人連向相應時間內可以到達的門的分點(可以$bfs$預處理最短距離,小於等於分點時間就可以連邊),二分時間驗證。

一開始想錯了,打算直接黑白染色然後拆點跑最小費用最大流,然後發現這個限流不好實現。

然後推翻了重想:對於乙個格仔$(x,y)$,只能有乙個高度,先假設沒有$d$的限制,可以直接按高度拆點串聯起來跑最小割(其實就是最小),有了$d$的限制,就是考慮如何使割掉高度差大於$d$的邊不可行,這樣的問題考慮加$inf$邊。對於格仔$(i,j)$高度$k$,把它割了,要保證與他相鄰且差$d$以內的點仍能流過,那麼建一條邊,起點在$(i,j,k)$,終點在$(x,y,k-d+1)$就能滿足其間有流(保證相距過遠的邊不會同時被割)。這樣建邊是$n^2$的。一開始$n^4$建邊t掉了。

這類問題好像叫二元組建圖最小割。就是求最小花費,把每乙個點與s點連邊表示它在s的代價,與t連邊表示它在t的代價,點$x,y$之間的邊表示它們不在同一邊的代價。如果不割圖,整個圖的權值和是不合法的(點只能與s,t其中一方連邊),也就是說,最終每個點不能同時連線s和t,割以後便可以滿足,最小割就是最小代價。這題又是反過來啦,先選所有員工,再考慮不選乙個員工的代價以及兩員工不再同一集合的代價,獲利總和減去最小代價就是最大獲利。

類似二元組建圖,這題加上了自己選科帶來的收益。先選中所有狀態,再割掉衝突。對於自己不選文/理的代價可以直接與源點/匯點相連,兩人之間的代價需要新建節點,與源/匯點連相應流量,分別連向兩人無限流量,割掉源/匯點到此新建點的邊表示兩人不滿足同時選文/理(如果兩人同時選文/理,源/匯點本來就有連向兩人的邊了,那麼割掉這條邊無貢獻反而增加了割的大小)。

其實這是最小割樹。對於一組點對$(x,y)$,它的最小割分成的兩個區域s和t,有性質s中的點與t中的點組成點對的最小割是$(x,y)$的最小割,這個可以不斷把圖分割,分治下去得到樹形結構。本題要求不同的最小割,只需要統計出現的最小割就行了。

先轉化題意:求矩陣a使得$\sum \limits_^n \sum \limits_^n a_i*a_j*b_ -\sum \limits_^n a_i*c_i$,也就是說,b中的乙個格仔能產生貢獻,需要他的列號和行號對應a中的數值都為1,c中的乙個格仔能產生代價,需要對應a中值為1。有變成了人員僱傭一類的題:選中需要代價,兩個一起選會產生貢獻。那麼就可以最小割了。

首先最優情況下每乙個點的高度是0或1。先想想dp可不可行,發現城市的狀態不一定是對頭分成兩半的形狀,可能彎曲很多次,這只能狀壓了。那麼我們再考慮每一條邊產生代價的條件:邊的兩點高度不一。於是就可以用最小割模型。這題的最小割建出來,s和t分別只用連出1條有權值的邊,加上原來的網格圖是一張平面圖,可以轉化對偶圖跑最短路求最大流。$o(m*\log n)$

這類問題嚴格規定了每個點經過的次數(包括起點在內),考慮拆點限流。我們可以把乙個人的總路線拆成許多小段(兩點的路)的組合,這些組合之間互相獨立。又有每個點次數的限制,假如p點要求經過x次,有t人以p為總起點,應當有$p作為小段起點$x-t$次,作為小段終點x次。這些總起點可以另用乙個附加源點限制,給人數個的流量,再連向每個拆點的出點,表示那些點作為小段起點的次數少於作為終點。

與上題類似,但建邊稍有不同。考慮從每個星球瞬移到另乙個星球,不必在星球之間建邊,直接從源點連向星球出邊是等效的。

考慮每個車產生的貢獻:取決與是哪個人員修的,以及這是那個人倒數第幾個修的(對後面的修車都有貢獻,乘上倍數)。對於每乙個技術人員,每乙個修車時間(修一次為一單位時間)都是獨立的,拆點跑費用流。

修車加強版。考慮修車那題建邊的不妥之處:一次建出了n^2m條邊,但事實上對每次增廣來說,對於同乙個廚師來說他做倒數第一道菜比倒數第二到菜產生的貢獻要少,所以倒數第二道菜是暫時不需的,只有做了倒數第一道菜才連倒數第二到,注意要連向所有的菜。

考慮了拆點但是並不可做,因為拆完以後就沒辦法限制次數了。不能拆點,想想二分圖?著重於本題的特性,$a_j|a_i$並且$a_i/a_j$是質數,那麼唯一分解後$a_i$的質因子一定比$a_j$多乙個,這樣的點之間才有連邊。計算每個數的質因子個數,相當與奇-偶連邊(能整除時)。二分圖上跑最大費用最大流。

原始思路:對匹配的點對連邊,然後找最大完全子圖。網上一搜發現是個np完全性問題。。

這題還是逆著考慮,對不匹配的點對,一定要棄掉乙個。這題的衝突為不匹配,

一定要考慮好是誰限制誰,並且要保證每乙個閉合子圖都能滿足題意才。一般都是把收益連向代價,一般收益不能獨立被選。

對於每乙個植物,能吃掉的前提:吃掉所有保護它的植物以及它後方的植物。這裡直接跑最大閉合子圖會有乙個問題,就是有環。先dfs一遍,如果乙個點能通向乙個環(或者在環內)那麼這個點打上ban標記,網路流的時候就不經過他了,權值也捨去。

對於收益,因為有包含關係,建乙個類似樹形的結構:(l,r)向(l+1,r)和(l,r-1)連邊,點權為相應美味度。對於「葉子」節點,還需連向其代號的權值-m*x^2的點,表示每個序號只計費一次m*x^2,並且」葉子「的權值減去代號x。然後就可以跑最大權值閉合子圖了。

這裡有點混亂。要求下界滿足,就要在附加流中調平流量,一旦附加流的ss、tt能滿流,就說明已經可行(但不是最大流,也不是最小流)。如果要最大流,就得在原圖殘量網路上跑s->t的最大流,最小流跑t->s的。費用流的話把相應的改最大流為最小費用最大流,而可行與最大流的差別是在於對s->t的增廣與否。

感覺很熟悉的樣子。如果每條邊只能經過一次的話可能就是貪心問題了。

對於稠密圖一定要加當前弧優化。

志願者一次付費可以工作多天,但是網路流無法實現一次購買流多個流量。考慮把每一天串連起來,每天的限流為-a_i(inf-a_i),s連向第一天、n+1天連向t,流量為inf。因為網路流相當與把串連的流量取了個最小值,所以取負數跑出來的是志願者最多的一天的流量。每個志願者從他開始的那天連向結束的後一天,流量為inf,費用為c_i。由於存在合法方案,s-t最大流一定為inf,每一天的點的流入流量也是inf(一定可以買夠志願者),這樣連邊就相當於彌補了一段區間的流量。

網路流總結

今天學的網路流,總的感覺來說稍難,不管是理解還是什麼,但是理解了後,就變得簡單許多。ford fulkerson演算法 是來求最大流量問題,從源點出發,到匯點,到底能多少能流入匯點。演算法 1 從源點出發,找相鄰邊,如果相鄰邊未被找過並且還可以流入流量就dfs。2 更新流入的邊。3 重複操作,直到沒...

網路流總結

今天做了一天的網路流,也發現了很多有趣 有毒 的建圖方法,也算是收穫很多了,這裡就做個總結吧。網路流跑的方法大家都會我就不說了,題考察的重點也就是建圖。建圖就涉及到2個方面 1.建點。建點其實就是網路流的難點了,一般點弄好了邊也容易了。建點的困難就在於有時要拆點,我總結了一下拆點主要是這幾個作用 a...

網路流總結

1.hdu1532 給網路圖,求1 n的最大流.注意邊數 2 2.hdu3572 經典建圖模型,有些東西能轉換為容量考慮 網路流演算法.dinic學了乙個多路增廣優化,能少一次遞迴的時間 1.hdu1533 建圖方式,假設有cntm個人,cnth個房子,分別對應編號 1,cntm cntm 1,cn...