1. 程式人生 > >網絡流二十四題,題解summary

網絡流二十四題,題解summary

套路 一個 魔術 覆蓋問題 是把 大於 的人 了解 配對

沒有全部寫完,有幾題以後再補吧。

第一題:最簡單的:飛行員配對方案問題

講講這個題目為什麽可以用網絡流?

因為這個題目是要進行兩兩之間的匹配,這個就可以想到用二分圖匹配,二分圖匹配又可以用網絡流寫。

為什麽二分圖匹配可以用網絡流寫呢?

你在二分圖上面加一個源點和一個匯點,然後你求從源點到匯點的最大流,這個是不是就是二分圖的最大匹配。

第二題:最小路徑覆蓋問題

這個題目是一個特別明顯的二分圖問題,也用到了一個比較常見的方法拆點法,

這個再介紹一下拆點法這個網絡流裏面的基本套路該什麽時候用,

如果你碰到一個網絡流的題目,題目對每一個點有次數限制,這個時候就需要對這個點進行拆分。

拆分的方法有很多種,這個可以慢慢積累,也沒有特別重要。

這個題目如果你對二分圖定理很了解,這個就會是一個比較簡單的題目了,可以學習一下二分圖的定理

主要有三個:最小頂點覆蓋數=最大匹配數 最大獨立集=總數-最小定點覆蓋數 有向無環圖(DAG)最小路徑覆蓋數=原圖上的點數-最大匹配數

這幾個概念再很多地方都可以看到,尤其是最大獨立集。

這個題目就是直接讓你求一個圖的最小路徑覆蓋數,這個對每一個點也有次數限制,每個點只能用一次,所以這個就要用拆分法,

不過這個題目所用的拆分法有一點點不同,一般題目都是把一個點拆成兩個點,然後把這兩個點連起來,連起來的這條直線的容量為1.

但是碰到這個二分圖匹配問題,如果你這麽連,很顯然是沒有意義的。

然後再分析:這個最小路徑覆蓋,最多的肯定是n,一共有n個點,然後我們在合並的過程中路徑數量不斷減少。

所以這個題目最小路徑覆蓋數,就是本來有的n個點再減去可以兩兩合並的數。

最後就是輸出,這個輸出就自己看代碼吧。

第三題:魔術球問題

這個題目也是一個二分圖問題,我覺得不是那麽簡單吧。

給你的柱子數就是最小路徑數,放球條件就是建圖條件,讓你求可以放的最多的球數量,就是最多的點滿足可以滿足這個圖。

這個題目要拆分,一個點連接源點,一個連接匯點,這被拆的兩個點不能連起來。

每一個球,就先去遍歷,如果可以和之前的一些球有建圖條件,就先建圖,建完圖之後跑最大流(增光路),如果增廣路不為0,

那就說明這個可以放在之前用的柱子裏面,不然就再開一個柱子,如果柱子數最後達到n,就跳出循環。

這個為什麽說增廣路不為0,就說明可以放在之前的柱子裏面呢?這個是因為,我們對於每一條線得容量都設為1,

所以這個就說明,每新增加一個球,如果增廣路不是0,則說明它肯定和之前柱子的最上面的那個球連在了一起。

因為和下面的球就算連在了一起,也沒辦法增廣了(容量為1)

知道了,這些建圖就很簡單了。這個是一個很巧妙的建圖。

可以看下面的圖片理解一下。

技術分享圖片

第四題:圓桌問題

這個是一個二分圖的多重匹配,這個題目比較簡單,這個多種匹配就直接跑一個最大流好了。

題目不是要求同一個單位的人不能坐在一起嗎?那就每一個單位都向每一個桌子連一條容量為1的線,這個就可以保證

不會有一個單位的人坐在一起了,如果最大流大於等於所有單位人之和,那就可以滿足,否則就不可以。

為什麽會這麽想呢?這個是因為我首先知道這個是一個網絡流的題目,我需要建圖,然後就很好做了。

第五題:試題庫問題

這個題目就不說了,這個題目和圓桌問題簡直一模一樣。

第六題:最長不下降子序列

這個題目建圖很難想,第一問就是一個裸的LIS,

主要就是第二問,這個題目我是沒有想到,看了一下題解,首先要進行拆點,因為每一個點只能用一次。

這個建圖就是先對這個序列進行處理,怎麽處理呢?求出f數組,f[i]代表到第i位的最長不下降子序列,

如果f[i]==1,那就直接和源點相連,然後之後如果滿足a[i]>=a[j]&&i>j&&f[i]==f[j]+1

那麽就把j的出點和i的入點連起來。

這個就是建圖,這個樣子建圖好難想啊。

不過看了題解之後也沒有覺得特別難了,這個更加具體的解析就看看博客吧。

第七題:餐巾計劃問題

網絡流二十四題,題解summary