• Tidak ada hasil yang ditemukan

網路流Flow Network

N/A
N/A
Protected

Academic year: 2023

Membagikan "網路流Flow Network"

Copied!
11
0
0

Teks penuh

(1)網路流 Flow Network 假設你要把一堆鈾元素從一個加工處運送到一個發電廠,運送的越多發電量就越大,但每 條路都有其運送量上限(以免太顛簸產生核分裂,如右下圖),中繼站則沒有這個限制,那該如 何安排運輸路徑,使得發電廠的總發電量最大呢 ? 這、就是網路流問題的起源(誤)。. 問題定義 把問題抽象成圖論模型(如左上圖),在給定的圖 G=( V , E ) 當中,有一個源點(source) s、 一個匯點(sink) t,對於每一條 ( u , v ) ∈ E,都有一個容量 c : E→R+,一個流量 f : E→R。下文 將以 c( u , v ) 表示邊 ( u , v ) 的容量,f ( u , v ) 表示邊 ( u , v ) 的流向(有向的!)。 若 ( u , v ) ∉ E,則 c( u , v )=0。此外,一個 flow 有以下三個性質(定義的): 1.斜對稱性(Skew symmetry):正負號可以理解成流的方向。 ∈ 2.容量限制(Capacity constraints):流量不能超過容量(這裡只考慮正容量) ∈ 3.流量守恆(Flow conservation):只有源點是流的提供者、匯點是流的消耗者,其他的點都 只能是中繼站,不增加也不減少流量。 ∈ ∈. 且定義一個網路的流量為. ∈. 而最大流問題就是最大化 | f |。 為了方便,我們定義符號. ∈. ∈. 。則顯然有以下性質:. 1. F( X , X )=0 2. F( X , Y )=-F( Y , X ) 3.當 X∩Y=∅,則 F( X∪Y , Z )=F( X , Z )+F( Y , Z ) 由此也可以推出前面提過的,| f |=f ( V , t )。舉例如下: | f | = f ( s , V ) = f ( V , V ) - f ( V-s , V ) = -f ( V-s , V ) = f ( V , V-s ) = f ( V , t ) + f ( V , V-s-t ) = f(V,t). F-1.

(2) 最大流問題 解決最大流問題很有名的有增廣路算法、最短增廣路算法、預流推進算法等等。 在進入正題之前,先引入殘餘流量網路的定義。假設一個流量網路 G = ( V , E ),他的殘 餘流量網路 Gf = ( V , Ef ) 是指 Ef ={ ( u , v ) | 0 < f ( u , v ) < c( u , v ) 或 f ( u , v ) < 0 }。此外, 定義邊 ( u , v ) ∈ Ef 的殘餘容量 cf ( u , v )=c( u , v )-f ( u , v )。因為一條邊在殘餘流量網路中 最多只會被拆成兩條,因此 | Ef | ≤ 2 | E |。假設在 Gf 當中,存在一條路徑從 s 走到 t,經過的 最小殘餘流量為 f’,顯然原流量網路的流量可以增加為 f+f’。這就是增廣路定理: 一個網路達到最大流若且唯若其殘餘網路中 s 到 t 沒有路徑。 基於此定理,直接可以得出增廣路算法,FORD-FULKERSON algorithm: FORD-FULKERSON ( G , s , t ) 1 while there exists a path p from s to t in the residual network Gf 2 do augment along path p and update the residual network Gf Ford-Fulkerson 中,第一行找尋增廣路的方法是隨便找(例如 DFS)。而沿著 p 增廣的意思 是指把 p 上所有邊的流量都增加 f’,殘餘流量網路中 p 上所有邊的殘餘容量都減少 f’,相對應 的反向邊殘餘容量增加 f。 ’ 設流量網路 G 的容量皆為整數,因為每次增廣流量最少增加 1 單位, 找增廣路的時間為 O( V+E ),因此總時間複雜度為 O( E | f *| )。一種最壞情況如下圖。. 稍後,Edmonds+Karp、Dinic 分別證明了只要每次找長度最短的增廣路,則總共增廣次 數為 O(VE)。假如用 BFS 找最短增廣路,總時間複雜度即為 O( VE2 )。底下給出證明: 1.先證明最短增廣路的長度非遞減,用反證法: (1)設 δf ( s , x ) 為源點到 x 增廣前在 Gf 中的最短路,令 v 是在某一次增廣後 δf ( s , v ) 變小的 點中距離原點最近的點。 (2)設 δf ’ ( s , x ) 表示源點到 x 增廣後在 Gf ’ 中的最短距離,則我們有 δf ’ ( s , v ) < δf ( s , v )。 (3)令 u 是 v 增廣後在 Gf ‘ 最短路徑中的前一個節點,δf ’ ( s , v )=δf ’ ( s , u )+1。因為我們選擇 v 的方式,δf ( s , u ) ≤ δf ’ ( s , u ) δf ( s , u )+1 ≤ δf ’ ( s , u )+1=δf ’ ( s , v ) < δf ( s , v )。換 句話說,( u , v ) ∉ Ef,因為 ( u , v ) ∈ Ef 意味著 δf ( s , v ) ≤ δf ( s , u )+1。 (4) ( u , v ) ∉ Ef 但是 ( u , v ) ∈ Ef ‘,可知這次增廣時經過 ( v , u ),故 δf ( s , v )+1=δf ( s , u )。 但這與 δf ( s , u )+1 < δf ( s , v ) 矛盾,因此這樣的 v 點不存在,最短增廣路長度非遞減。 2.證明增廣次數為 O(VE): ( * 定義一次增廣的 critical edge 為該次增廣中剩餘容量最小的邊,若有多個任一皆可。) (1)令邊 ( u , v ) 為某次增廣中的 critical edge,則增廣後我們會有( u , v ) ∉ Ef ‘。若往後某次增 廣後 ( u , v ) 再度出現,該次增廣必定沿著 ( v , u ) 增廣。. F-2.

(3) (2)讓 ( u , v ) 消失的那次增廣中,δf ( s , v )+1=δf ( s , u )。讓 ( u , v ) 再次出現的增廣中, 有 δf ’ ( s , v )=δf ’ ( s , u )+1。最短增廣路長度非遞減,故 δf ( s , v )+2 ≤ δf ’ ( s , v )。 (3)最短增廣路的長度不超過 | V |-1,故一條邊成為 critical edge 的次數不超過 ( | V |-1 )/2 每次增廣最少有一條 critical edge,由定義知 | Ef | ≤ 2 | E |,因此總增廣次數為 O(VE)。 Edmonds-Karp 算法每次都是找最短的增廣路,所以也有人以最短增廣路算法(Shortest Augmenting Path algorithm)稱呼。虛擬碼如下: EDMONDS-KARP ( G , V , E , s , t ) 1 |f|←0 2 INIT-FLOW-NETWORK( G , V , E ) 3 while FIND-SHORTEST-AUGMENT-PATH( G , V , E , s , t , π ) returns true 4 | f | ← | f | + DO-AUGMENT( G , V , s , t , π ) 5 return | f | 不斷找尋最短增廣路並增廣 INIT-FLOW-NETWORK( G , V , E ) 1 for each ( u , v ) ∈ E do 2 f(u,v)←0 3 f(v,u)←0. 初始化,流量歸零. FIND-SHORTEST-AUGMENT-PATH( G , V , E , s , t , π ) 1 Queue ← { s } 用 BFS 找尋最短增廣路 2 while Queue is not empty do 3 u ← pop Queue 4 for every ( u , v ) ∈ E do 5 if v have never been in the Queue do 6 π[ v ] ← u 7 push u into Queue 8 if t have ever been visited then return true 9 else return false 若沒有增廣路就回傳 false DO-AUGMENT( G , V , s , t , π ) 1 cp ← ∞ 2 v←t 3 while v ≠ s do 4 cp ← min( cp , cf ( π[ v ] , v ) ) 5 v ← π[ v ] 6 v←t 7 while v ≠ s do 8 f ( π[ v ] , v ) ← f ( π[ v ] , v )+cp 9 f ( v , π[ v ] ) ← f ( v , π[ v ] )-cp 10 cf ( π[ v ] , v ) ← cf ( π[ v ] , v )-cp 11 cf ( v , π[ v ] ) ← cf ( v , π[ v ] )+cp 12 v ← π[ v ]. 找出 critical edge 的殘餘容量. 增加流量、修正殘餘流量網路. 利用距離標號的概念,我們可以把每次尋找增廣路的代價降低,使得總時間複雜度進步到 O(V E)。這是 Ahuja 和 Orlin 在 1987 年對最短增廣路算法的改進(Ravindra K. Ahuja, Thomas L. Magnanti, and James B. Orlin. Network Flows: Theory, Algorithms, and Applications. )。Yefim Dinitz 在 1970 年時提出 Dinic’s algorithm, 2. 利用 blocking flow 的概念找尋最大流,時間複雜度是 O(V2E)。特別地,其算法在單位容量網 路中的時間複雜度為 。另外還有 Preflow-Push algorithm 也有 O(V2E) 的時間複雜度 (上界較緊),甚至可以再優化到 )。底下將介紹 Ahuja 和 Orlin 的改進。 F-3.

(4) (1)定義距離標號 d : V→N∪{ 0 },且 d( t )=0,而對於 ( u , v ) ∈ Ef,d( u ) ≤ d( v )+1。也就是 說 d 是到匯點的最短路的下界,d( v ) ≤ δ( v , t )。顯然 d( s ) < | V |,為了方便,若點 v 在殘 餘流量網路中無法到達匯點,我們定義 d( v )=| V |。 (2)可行弧(admissible arc):對於 ( u , v ) ∈ Ef,如果 d( u )=d( v )+1,則稱 ( u , v ) 為一條可行 弧。顯然一條由 s 到 t、由可行弧組成的路徑是一條最短增廣路。 顯然我們要不斷找由可行弧組成的增廣路來增廣直到沒有增廣路。但 d 只是個下界,甚至 一開始可以全部為 0,因此我們需要「製造」可行弧來。定義兩種操作:ADVANCE( u )以及 RELABEL( u )。前者是從 u 往下走一個允許弧,後者是對點 u 進行重標號的動作: ADVANCE( u ) 1 if we can find an admissible arc ( u , v ) then do 2 π[ v ] ← u 3 u←v 4 return true 5 else return false RELABEL( u ) 1 d( u ) ← | V | 2 for every ( u , v ) ∈ E do 3 if d( v )+1 < d( u ) then do 4 d( u ) ← d( v )+1 當網路流還存在一條增廣路時,透過(多次)重標號,一定可以造出一條可行弧組成的增廣 路。整個算法的主程序如下所示: IMPROVED-SHORTEST-AUGMENTING-PATH( G , V , E , s , t ) 1 |f|←0 2 INIT-FLOW-NETWORK( G , V , E ) 3 initial d to be all zero 4 v ← s , π[ s ] ← s 5 while d( s ) < | V | do 6 if ADVANCE( v )=true then do 7 if v=t then do 8 | f | ← | f | + DO-AUGMENT( G , V , s , t , π ) 9 v←s 10 else do RELABEL( v ) 11 v ← π[ v ] 12 return | f | ADVANCE( u ) 的第一行可以一條一條遍歷所有( u , v ) ∈ E。而主程序的第三行也不一定全 部初始化為 0,可以先從匯點 BFS 回來得到一個不錯的標號。試著把整個算法用遞迴實現。 分析時間複雜度的時候,我們分開計算 ADVANCE 和 RELABEL 的花費。可以用數學歸納法 證明 d 的值非遞減,且每次進行 RELABEL 之後 d 一定增加。對每個點 v,d( v ) ≤ | V |,因此一 個點最多只會被 RELABEL 過 | V | 次,可知 RELABEL 函式的總花費時間為:. ∈. ∈. 再來,對於一個點 v 執行 ADVANCE 時只會有失敗、成功兩種情況,執行失敗會導致 RELABEL,因此整個算法執行 ADVANCE 失敗的次數為 O(V2E)。對於點 v 在兩次 RELABEL 之 F-4.

(5) 間 ADVANCE 成功的花費而言,因為最多會有 deg( v ) 次成功,每次 ADVANCE 成功的花費為 deg( v ),又一個點最多被 RELABEL 過 | V | 次,所以 ADVANCE 成功的總花費是. ∈. ∈. ∈ 2. 所以改進後的最短增廣路算法時間複雜度即為 O( V E )。此外,還有幾個常用的小技巧。 注意到一條弧在 ADVANCE 失敗後,在下一次 RELABEL 前一定不可能再成為允許弧,因此在 ADVANCE 的時候可以不用檢查。只要用固定順序檢查邊、紀錄上一次檢查到哪一條邊即可。 其次,進行時 RELABEL 時,若發現重標號造成 d 的值不連續(中間有缺口),此時一定已經 達到最大流,可以停止尋找。奇怪的是,RELABEL 時直接把 d 加一反而比真正重標號快。 最大流的延伸思考 . 網路流最強大的部份在於許多問題都可以建立網路流模型來解決,請參考 poao 的題單。 此外,除了我們這邊介紹的兩種找最大流的方法(隨時隨地都維持 flow 的三個性質), PREFLOW-PUSH 算法應用了「預留推進」的概念,也就是先流過量、再慢慢把多餘的流推進 到後繼節點上,十分有趣。至於目前最快的最大流算法需要用到資料結構輔助。 . 找最大流的算法複雜度有點高。但是若現在已經給定一張流量網路及其上的一個最大流, 而有某一條邊的容量被增加/減少了 1 單位,那如何在 O( V+E )的時間內求出新的最大流 ? . 為什麼 Ford-Fulkerson 需要限定容量為整數呢 ? . 之前我們只考慮 c( u , v ) > 0 的情況。但若 c( u , v ) < 0 呢 ? 代表什麼意義 ? 此時是否一 定會有可行流嗎 ? 設 G=( V , E ),為有負容量、源匯點為 s , t 的流量網路,建立新的流量網路 G’=( V’ , E’ ), 容量為 c’、源匯點為 s’ , t’ ,而 V’=V∪{ s’ , t’ },E’ = E∪{ ( u , v ):( v , u ) ∈ E }∪ { ( s’ , v ):v ∈ V }∪{ ( u , t’ ) :u ∈ E }∪{ ( s , t ) , ( t , s ) },且指定 c’ ( u , v ) = c’ ( v , u )=( c( u , v )+c( v , u ) )/2, 且對於所有 v ∈ V,有 c’ ( s’ , v ) = max( 0 , ( c( V , u )-c( u , V ) )/2 ), c’ ( v , t’ ) = max( 0 , ( c( u , V )-c( V , u ) )/2 ), c’ ( s , t ) = c’ ( t , s ) = ∞ 觀察看看 G’ 和 G 的最大流的關係。 最小切割與最大流 一張圖的一個切割(cut)是對點集 V 的一個分割,把它分成 X 和 Y 兩部份,表示成 C( X , Y )。 對於一個流量網路而言,一個割 C( X , Y )的容量定義為 。 ∈ ∈ 顯然一個對 S-T 而言,我們有 | f | = F( S , T ) ≤ C( S , T )。(由流量限制及第一頁介紹的性質) 那上式的等號何時成立呢 ? 假設 | f | 是流量網路 G 的一個最大流,取源點及殘餘流量網路 Gf 中 s 可以到達的點為 S,剩下的點為 T,此時等號成立。這就是最小切割最大流定理。 對於一個流量網路 G=( V , E )、源匯點為 s , t、最大流為 f 而言,以下三個敘述等價 1. G 的流量為 f。 2. G 的殘餘網路 Gf 中,不存在一條增廣路。 3. 令 C 為 G 中的一個 S-T 割,且 C 的容量為 f。. F-5.

(6) Minimum Cost Maximum Flow 最小花費最大流與普通的最大流很相似。不同的是,每條邊都有 cost。 每條邊每多流過一的流量就會多花一次 cost。而所求則是在最大流的狀況下 cost 最小能多小。. Successive shortest path algorithm 還記得 Edmonds Karp 嗎?其實只需將 Edmonds Karp 的 BFS 修正為最 短路算法即可作出最小花費最大流。然而須注意的是由於網路中有負邊,故無 法直接使用 dijkstra,而需使用 SPFA 等算法。 要注意的是這種算法無法處理有負環的狀況,此時必須對網路進行預處 理:消圈。將所有負圈預先流滿,接著再開始作即可。 另外可以證明,若圖中原本沒有負圈,則流過一條流量後也不會在圖中 形成負圈。也就無須擔心流到一半即因負圈而超時。 Pf:假設現在圖中並無負圈,且增廣了一條最短路徑 S 後卻出現了一個負 圈 C。則路徑 S 必定與 C 的反向路徑 C'有一交集 A'。由於 C 是負圈,可知 cost(C – A) + cost(A) < 0。也就是 cost(C – A) – cost(A') < 0。亦即 cost(C – A) < cost(A')。則我們可將 S 中的 A'取代為(C – A)而獲得一條更短 的路徑,與假設矛盾,故得證。. Maximum Bipartite Matching 所謂二分圖乃係指一張可將點集分為 A,B 兩集合使任兩個同集合的點之 間無邊之圖。而所謂匹配則是指從圖中選出一些邊集使選出的任兩條邊沒有共 用的頂點,其中最大的一組邊集即是最大匹配。 對於一般圖而言,求出最大匹配是一件有難度的事情。但若是在二分圖 上則因其圖特性可將難度大大降低。許多在一般圖上目前非 P 之問題,在二分 圖上也可藉由二分圖最大匹配而降為 P。. Convert to Maximum Flow 二分圖匹配可以簡單的建模為網路流,然後藉網路流的算法來解決。. S. T. 圖中所有邊的容量都設為 1。此建模的最大流就是最大匹配數,最小 割集即為最大匹配(記得不要割到 S 連出去的邊)。.

(7) Augmenting path algorithm 二分圖匹配有一個著名的算法,他時常被訛傳為匈牙利算法,但其實他 是增廣路算法。增廣路算法顧名思義,核心思想就是不停的找出增廣路,直到 無法再增廣為止。 增廣路算法中的增廣路與網路流中的增廣路稍有不同,它指的其實是一 種交錯路徑。所謂的交錯路徑就是一條由未匹配邊、匹配邊交錯型成的路徑。 以紅色邊代表匹配邊,黑色邊代表未匹配邊,則以上就是一條交錯路徑。 而增廣路,就是一條首尾都是未匹配邊的交錯路徑。如果我們能找到一條增廣 路,那麼我們只需將路徑上所有邊的匹配狀態反轉,即可增加 1 的匹配數。. 經過觀察,其實會發現我們只需枚舉每一個點為起點去找增廣路徑最後 便會得到最大匹配,故複雜度為點數 * 每次找路徑的花費:O(V * E)。 Function MaximumBipartiteMatching( vertex ): cnt ← 0 for each v in vertex: v.match ← null for each v in vertex: if v.match = null: for each u in vertex: u.visited ← false if Augment(v): cnt ← cnt + 1 return cnt Function Augment( node ): v.visited ← true for each v adjacent to node: if v.match = null or (v.match.visited = false and Augment(v.match)): v.match ← node node.match ← v return true return false.

(8) Hopcroft Karp algorithm HK 算法是一種基於增廣路算法的優化版本。在增廣路算法中,我們一次 只找出一條增廣路徑,但在 HK 算法中則先將二分圖標號為分層圖再一次找出 多條增廣路,可以證明重標號最多 sqrt(V)次,故總複雜度降為 O(sqrt(V) * E)。 不過由於 HK 實作起來的長度約為增廣路算法的一倍,且實用性在競賽中不高, 故不多贅述。. Minimum vertex cover & Maximum independent set 最小點覆蓋跟最大獨立集,在一般圖中都是 NPH 問題。他們的判定性問 題則是 NPC。然而,在二分圖中,這些問題是非常簡單的。 Minimum vertex cover 最小點覆蓋之意義乃是找出一個子點集,使得每一條邊至少有一端頂點 存在此點集中。在二分圖裡,最小點覆蓋就等同最大匹配。 第一:最大匹配是下界。若只考慮匹配邊你會發現由於這些邊頂點互相 獨立,所以至少需要最大匹配數的點來覆蓋。 第二:最大匹配是上界。考慮現在已作出最大匹配,接著將增廣路算法 修改為 BFS 實作,並在開始所有未匹配的點丟入 queue 中。BFS 完後選取所有 深度奇數的點(剛開始的深度都是 0),即覆蓋掉 BFS tree 上所有的點所連接的邊。 最後對剩下的匹配邊任選其中一側的點。如此便構造出一組覆蓋。 Maximum independent set 最大獨立集之意義乃是找出一個子點集,使得點集中任兩個點之間沒有 邊互連。而其實,最大獨立集便是最小點覆蓋的補點集。故只需先求出最小點 覆蓋即可求出最大獨立集。. Maximum Weight Bipartite Matching 一如網路流有最小花費流,二分圖匹配也有最大花費匹配。最大花費匹 配的定義是找出一組完美匹配,使得匹配邊的邊權總合最大。另外對於原本沒 有邊的點對,會視為他們之間有一條 cost 為 0 的邊。. Convert to Minimum Cost Maximum Flow 最大花費匹配只需將邊權取負值即可用同樣手法建模成最小花費流來解。. Kuhn Munkres algorithm (Hungarian method) KM 算法,其實也就是真正的匈牙利算法。是在最大花費匹配中一個有名 的算法。KM 算法的是用來在一個完全圖中求出一組完美匹配使得匹配邊的權 重總合最大。要理解 KM 算法,得先理解可行頂標的概念。對於每個點 Xi 各自 有一個可行頂標 flg[Xi],可行頂標的值沒有限定,唯一的限制是對於任意一條 邊 Ei, 假設其連接 Li, Ri 則 flg[Li] + flg[Ri] >= cost[Ei]。.

(9) 我們可以輕易的發現,若有一組完美匹配,每個匹配邊 Ei 的 cost[Ei]都恰 好等於 flg[Li] + flg[Ri],則此匹配必定是最大花費匹配。因為任意一組匹配其 權重總合必定小於等於所有點可行頂標合,而此匹配之權重合恰等於可行頂標 合,故沒有任何組合的權重會大於這組匹配。KM 算法的核心思想就是藉由不 斷修正可行頂標找到這樣一組完美匹配。 首先我們可以任意指定一組合法的可行頂標,接著從左側任意挑一個尚 未匹配的點進行普通的增廣路算法,要注意的是只有 cost[Ei] = flg[Li] + flg[Ri] 的邊才被視為可行邊。如果成功找到增廣路則直接增廣,若沒有找到則我們找 到一個極大值 D,使任意一條邊 Ei 若 Li 在增廣路徑樹且 Ri 不在增廣路徑樹上 則 D <= flg[Li] + flg[Ri] - cost[Ei] 。找到 D 後對於所有在增廣路徑樹上的點,若 其是左側點則可行頂標減少 D,反之則可行頂標增加 D。對於增廣路徑樹上的 所有邊其 cost[Ei] 必定依然等於 flg[Li] + flg[Ri],但對於原本不在增廣路徑樹上 的邊,則因其左側可行頂標減少而有機會進入樹中。對於一個點最多只需重標 號 V 次即可找到一條增廣路,所以最多只需重標號 V^2 次即可找到解。 由於此算法需重標號 V^2 次且每次重標號皆須 V^2 的複雜度,故其複雜 度為 O(V^4)。然而其實有辦法將其複雜度 reduse 到 O(V^3),因為沒有必要每 次重建樹且每次找出 D 也可降至 O(V)。至於詳細實作,就留待各位自己想。 Function MaximumWeightBipartiteMatching( vertexLeft, vertexRight ): flg[v] ← infinite for each v in vertexLeft flg[v] ← 0 for each v in vertexRight for each v in vertexLeft: while Augment(v) = false: D ← infinite for each adjacent pair E: if inTree(E.L) and inTree(E.R) = false: D ← min(flg[E.L] + flg[E.R] – cost[E], D) for each vertex u in vertexLeft: flg[u] ← flg[u] – D if inTree(u) for each vertex u in vertexRight: flg[u] ← flg[u] + D if inTree(u) return sum of flg[v] for each v in vertexLeft or vertexRight 以上虛擬碼為 O(V^4)的實作。由於 Augment 和普通匹配的 Augment 相似, 故不贅述。另外,由於最差狀況不易出現,所以 O(V^3)和 O(V^4)的執行速度 平時相去不遠。故除非測資為特別構造,否則 O(V^4)實作即可過關。 (根據 shik 大神友情測試,O(V^4)在隨機下跑 V=1000 輕鬆愜意。).

(10) Basic Internet Bandwidth. FLOW'S PROBLEM SET [UVa 820]. 無向圖最大流. 工廠生產問題. 點容量限制最大流. Farm Tour. 最小花費最大流. [TOI 2006 p4/TIOJ 1236] [USACO 2003/POJ 2135]. Classical [NPSC 2005 初賽 pE/TIOJ 1069]. 魔法部的任務. 有很多事件(≤1000)會在一個網格平面下發生,每個事件都有發生的時間點。現在你要派出一些鎢 絲去解決這些事件,可是鎢絲在網格上只能沿水平或垂直移動,且移動速度是一格/單位時間。 要解決一個事件必須要在該事件發生之前有至少一個鎢絲到達。問最少需要幾個鎢絲。 Angry Programmer. [Uva 11506]. 老闆開除了你,所以你很 Angry(不是 Angry Farmer),你知道老闆每天會從他的電腦經過很多 台 IP 分享器連到公司的數據機去打 Heuristic Game。你得知了每台分享器的連結關係還有破壞 每個分享器或每條線路的代價,你最少要多少代價才能阻止老闆打 Heuristic Game? Euler Circuit. [Uva 10735]. 一張有向無向的混合圖(|V|≤20),輸出任何一組歐拉迴路。 Bomb, Divide and Conquer. [Uva 10989]. 一張無向圖(|V|≤150),拆掉每條邊都有代價,請輸出最小代價使得存在至少一組不連通點對。 SAM I AM. [Uva 11419]. 一個 R×C 的方格,有些格子有石頭,山姆每次開大就可以炸掉一整行或列的石頭, 問他最少要開大幾次並輸出任意一組解。 房屋裁員. [99 校內賽 p4/POJ 2987]. 有一間公司決定要裁員,每個人都有一個可正可負的貢獻值,可是也有許多影響關係:A 對 B 有影 響的話,A 被裁掉 B 也會走人,問留下來的員工貢獻值和最大為多少。 Others Robots. [Mid-Central USA 2003 pB/POJ 1548]. 24×24 的棋盤上面有一些垃圾,要派出一些機器人清垃圾,每隻機器人固定從左上角出發,只能往 右或往下,會清掉經過的格子的垃圾,問最少需要幾隻機器人才能清掉全部垃圾。 Collectors Problem. [UVa 10779]. 有 n 個人 m 種貼紙,其中一人是主角,給每個人擁有的貼紙數量。非主角交換的規則只會用自己多 的貼紙換自己沒有的貼紙,並且只會跟主角換,問主角最多可以獲得幾種貼紙。 PIGS. [CROI 2002/POJ 1149]. 有很多豬圈(≤1000),每個豬圈都有一些豬、一開始每個豬圈都是鎖上的。 有很多依序來的客人(≤100),每個客人都有一個購買豬量的上限和一些豬圈鑰匙, 他們過來時會先把所有他有鑰匙的豬圈打開,從那些打開的豬圈中賣給他不超過他的上限的豬, 之後你可以重新安排那些打開的豬圈的豬分佈再把所有豬圈鎖上。問你最多能賣出幾隻豬? Gopher Strategy. [UVa 10779]. 平面上有很多隻地鼠烏龜(≤50)和烏龜洞(≤50),有老鷹要來抓烏龜所以他們必須沿著直線距離躲 到烏龜洞裡。因為烏龜太胖了所以一個洞只能躲一隻。他們希望至多犧牲 K 隻烏龜,且在這個前提 下讓最慢進洞的一隻烏龜進洞時間最短。請輸出該時間。.

(11) 多條嚴格遞增序列 給一個序列和 K,選出 K 條沒有重複數字的嚴格遞增的子序列,求 K 條序列長度和最大值。 [NPSC 2009 決賽 pB]. 一筆劃問題. 一張有向圖(|V|≤50),問最少要反轉幾條邊才能讓該圖存在一筆劃的方案? Contact Aliens. [NTUJ 0027]. 一個 R×C 的 01 二維陣列,問最少要把幾個 0 改成 1 使得每行每列都不會只有一個或兩個 1。 Destroying the bus stations. [Beijing 2008 pA/CLI 4329]. 給一張無向無權圖和 K,問要讓 S 到 T 的最短路>K 至少要拔掉幾個點。 志愿者招募. [NOI 2008 Day 1 pC]. 有一項工作需要進行 N(≤1000)天且每天都有需求人力下限。有 M 種勞工,每僱用一個該種勞工會 在一個特定時間區段[Si,Ti]提供一單位人力,但也要支付花費。問達成該工作最小花費。 飛機上有蛇. [NPSC 2009 決賽 pF]. 給一張 n×m 的地圖、有些格子有障礙物。可以用兩種蛇去把這張圖所有空格覆蓋恰好一次: 1.環狀的蛇 2.頭尾都貼在地圖邊界的蛇 問最少要幾種 2 型蛇才能達成目標。 Distributed Computing System. [NTUJ 0895]. 有一張許多工作站的連結圖(無向圖、工作站數≤50)和一個 C≤100000,你希望在每個工作站灌一 個特定軟體,該軟體有 1,2,3 三種版本,每個工作站安裝每個版本軟體都有不同成本。 而且任兩台有直接連結的工作站也會需要花費 c×(v1-v2)2 的相容性成本。求最小總成本 Not-A-Flow Backup. [APIO 2007 p2]. 數線上有 n≤10000 座辦公室,要牽 K 條網路線,每條網路線連接兩台電腦。而且每台電腦最多只 能連一條網路線,問網路線總長最短多長。 Dicing. [POI XII]. Dicing 是兩人玩的運氣遊戲。有許多人時常在一起 Dicing,並且選出勝場最多的人稱他為 Lucky Chap。現在給出所有兩兩交手的安排,問最少要贏幾場才能成為 Lucky Chap。. 其他題目: POJ 1815(難), 2396, 2455, 3686, UVa 563, 10080, 10092, 10330, 10511, 10888, 10248, 10418(難), 11159, CLI 4722, 筆記區. ☃.

(12)

Referensi

Dokumen terkait

老師生動活潑的教導,使我們在高中生活有了知性與感性的學 習,是我們最大的榮幸與收穫。感謝金群導師讓我們找到未來 的人生目標及努力勇往直前。或許現在的我們,不是最優秀的, 我們相信未來的前途必定會如同等加速度一般,達到最佳的成 就,更感謝老師為我們的付出與指導,讓我們在高中生涯劃下 一個完美的句點。 By302 有人說:再見是為了下一次更美好的遇見;也有人說:五百次

在水耕芹菜的營養液中滴加紅墨水如附圖一,一段時間後,取一葉柄橫切,可見其內部有 許多紅色小點如附圖二。請問:這些小點是什麼構造? 圖一 圖二 A韌皮部 B氣孔 C葉綠體 D木質部 66.. 小美在複式顯微鏡下,觀察到某個細胞具有細胞壁而無葉綠體,此細胞可能是: A洋蔥表皮細胞 B葉肉組織細胞 C變形蟲 D蛙的血球細胞