1. 程式人生 > >LOj裡面的網路流二十四題

LOj裡面的網路流二十四題

1/搭配飛行員:

給n個飛行員,有m個為副駕駛,其他為主駕駛。

每個飛機需要一個副駕駛和一個主駕駛,給出可以一起合作的組合,問最多可以讓幾架飛機起飛。

建立兩列點,一列為主駕駛一列為副駕駛,建立s與t,s向每個主駕駛連一條容量為1(每個主駕駛的人只能用一次),副駕駛連到t容量為1(每個副駕駛只能要一次),然後主駕駛與副駕駛合坐連一條容量為1的邊,最大流就是最大合作的數量(二分圖匹配應該也可以過)。

2/太空飛行計劃:

有n個實驗和m個儀器,每個實驗獲得不同的價值,每個儀器需要一定的購買費用,一些實驗會使用一些儀器,問最大獲利。

顯然最大權閉合子圖模型(S連向所有正權值節點,容量為價值,所有負權值節點連向T,容量為價值,原來的邊為INF)。

3/最小路徑覆蓋:

路徑覆蓋就是在圖中找一些路徑,使之覆蓋了圖中的所有頂點,且任何一個頂點有且只有一條路徑與之關聯;(如果把這些路徑中的每條路徑從它的起始點走到它的終點,那麼恰好可以經過圖中的每個頂點一次且僅一次)

1.一個單獨的頂點是一條路徑;

2.如果存在一路徑p1,p2,......pk,其中p1 為起點,pk為終點,那麼在覆蓋圖中,頂點p1,p2,......pk不再與其它的頂點之間存在有向邊.

對於一個路徑覆蓋,有如下性質:

1、每個頂點屬於且只屬於一個路徑。

2、路徑上除終點外,從每個頂點出發只有一條邊指向路徑上的另一頂點。

演算法:把原圖的每個點V拆成VxVx和VyVy兩個點,如果有一條有向邊A->B,那麼就加邊Ax−>ByAx−>By。這樣就得到了一個二分圖。那麼最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。

證明:一開始每個點都是獨立的為一條路徑,總共有n條不相交路徑。我們每次在二分圖裡找一條匹配邊就相當於把兩條路徑合成了一條路徑,也就相當於路徑數減少了1。所以找到了幾條匹配邊,路徑數就減少了多少。所以有最小路徑覆蓋=原圖的結點數-新圖的最大匹配數。