网络流专题(最大流与费用流)例题总结
文章目錄
- NC 106056 poj1459 Power Network
- 題目大意:
- 題解:
- NC213817 [網絡流24題]最小路徑覆蓋問題
- 題目:
- 題解:
- 例2:NC213818 [網絡流24題]魔術球問題
- 題目:
- 題解:
- 方法2:
- NC 213820 [網絡流24題]最長遞增子序列問題
- 題目:
- 題解:
- NC19939 [CQOI2015]網絡吞吐量
- 題目:
- 題解:
- 代碼:
NC 106056 poj1459 Power Network
題目大意:
總共有n個節點,其中有發電站np個、用戶nc個和調度器n-np-nc個三種節點,每個發電站有一個最大發電量,每個用戶有個最大接受電量,現在有m條有向邊,邊有一個最大的流量代表,最多可以流出這么多電,現在從發電站發電到用戶,問最多可以發多少電
? N<=100
題解:
? 我們之前講的網絡流都是單源單匯問題,這題是多源多匯,關鍵在于把多源多匯問題轉化為單源單匯,只要構造一個超級源點和一個超級匯點就ok了,把超級源點和各個源點之間加一條邊,把各個匯點和超級匯點之間加一條邊,這樣就搞定了
NC213817 [網絡流24題]最小路徑覆蓋問題
題目:
? 給定有向圖G=(V,E)。設P 是G 的一個簡單路(頂點不相交)的集合。如果V 中每個頂點恰好在P 的一條路上,則稱P是G 的一個路徑覆蓋。P 中路徑可以從V 的任何一個頂點開始,長度也是任意的,特別地,可以為0。G 的最小路徑覆蓋是G 的所含路徑條數最少的路徑覆蓋。
設計一個有效算法求一個有向無環圖G 的最小路徑覆蓋。
? 1≤n≤150,1≤m≤6000
題解:
? 每個點用一次——
? 每個點拆成出點和入點,入點向出點連容量為1的邊
? 原圖中存在x到y的邊的話,就從x的出點向y的入點連容量為1的邊
? S向每個點的入點連容量為1的邊,每個點的出點向T連容量為1的邊
一張圖中,路徑數(點不重復)=點數-點之間匹配數(連邊且不重復,也就是網絡最大流)。
在網絡流上體現為:最小路徑覆蓋=點的總數-網絡最大流
例2:NC213818 [網絡流24題]魔術球問題
題目:
? 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,…的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。
試設計一個算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子上最多可放11 個球。
編程任務:對于給定的n,計算在n根柱子上最多能放多少個球。
? 1≤n≤55
題解:
首先思想很重要,不是明顯的圖論,要往圖論方向靠
建圖方式:
S與左圖所有數相連,右圖所有數與T相連
對于一個進來的編號的球x,有兩個選擇:
第一個選擇是放在某個和他能組成平方數的球(我們起名為y)的后面
第二個選擇是自己單獨出來成為開頭
對于第一種選擇,當然要y和x連一個邊
對于第二種選擇,S要和x連一個邊
當然我們也要讓x與T連一個邊
但是一個點怎么能同時連多個,顯然一個點是不夠用的
我們將一個點給分開,分為x和x’
x與s相連,x’與t相連
為了滿足第一種情況,對于滿足條件的x和y兩個點,連接y和x’
這樣組成的圖直接跑最大流算法即可
球和柱子同時加,跑出的最大流為省掉的柱子數,如果加入一個數當前最大流沒有變化,說明柱子數+1,如果最大流+1,說明可以省下一個柱子、
方法2:
匈牙利算法也可以做
給定了柱子數n(最小路徑覆蓋數)以及放球條件(建邊條件),求最多有多少個球(最多有多少個點可以滿足這個最小路徑覆蓋數)。
枚舉球的數量。
每來一個球(點)m,枚舉1…m-1的每個點i,若i+m滿足建邊條件(和為完全平方數)則按以下方式建邊——
套路拆點,每個點i拆成Xi、Yi,對于一組i、m,連Xi<->Y(m+5000)雙向,跑匈牙利算出最大匹配。
根據二分圖相關定理:最小路徑覆蓋數=點數-最大匹配數。
算出當前圖的最小路徑覆蓋k,與給定柱子數比較。
k<n,繼續加球。
k=n,可能還有更大的答案,繼續加球。
k>n,m-1就是答案,停止加球。
輸出路徑,遍歷1…m-1每個X部點,向其匹配點走,直到無路可走,沿路標記為已遍歷。
已遍歷過的X部點不再遍歷。
NC 213820 [網絡流24題]最長遞增子序列問題
題目:
? 給定正整數序列x1 ,… , xn。 (1)計算其最長遞增子序列的長度s。 (2)計算從給定的序列中最多可取出多少個長度為s的遞增子序列。
(3)如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s
的遞增子序列。
? 編程任務:設計有效算法完成(1)(2)(3)提出的計算任務。
? 1≤n≤500
題解:
參考自眾多大佬題解
第一問好說,經典dp問題,
F[i],表示以第i位為開頭的最長上升序列的長度
第二三問是網絡流問題
因為題目要求是不下降序列,所以我們可以將不下降序列中的數字連邊
建圖方式:
對于第二問,我們直接求網絡最大流即可
對于第三位,我們將邊<11,12>,<n1,n2>,<S,1`>,<n2,T>
四個邊的容量改成無限大,再跑網絡最大流即可
對于一組數 1 6 3 2 5
對其建邊情況如下:
NC19939 [CQOI2015]網絡吞吐量
題目:
? 路由是指通過計算機網絡把信息從源地址傳輸到目的地址的活動,也是計算機網絡設計中的重點和難點。網絡中實現路由轉發的硬件設備稱為路由器。為了使數據包最快的到達目的地,路由器需要選擇最優的路徑轉發數據包。例如在常用的路由算法OSPF(開放式最短路徑優先)中,路由器會使用經典的Dijkstra算法計算最短路徑,然后盡量沿最短路徑轉發數據包。
? 現在,若已知一個計算機網絡中各路由器間的連接情況,以及各個路由器的最大吞吐量(即每秒能轉發的數據包數量),假設所有數據包一定沿最短路徑轉發,試計算從路由器1到路由器n的網絡的最大吞吐量。計算中忽略轉發及傳輸的時間開銷,不考慮鏈路的帶寬限制,即認為數據包可以瞬間通過網絡。路由器1到路由器n作為起點和終點,自身的吞吐量不用考慮,網絡上也不存在將1和n直接相連的鏈路。
? n<=500,m<=100000
題解:
第一反應是最小費用最大流,但其實并不是
題目要求的是在最短路的基礎上求最大吞吐量
若我們要走1到n的最短路,那我們只能走dis[v]=dis[u]+edge[u][v]的邊
所以我們第一步就跑遍最短路,保留最短路中的邊,此時邊權我們就可以忽略掉了,因為之后再也用不上
題目中吞吐量的限制與平常不一樣,這里不是對邊而是對點,對點的話沒辦法直接算,我們可以將點一分為二,將n個點拆成n*2個點,然后第i個點向第i+n個點建立一個容量為A[i]的邊
然后對于最短路中的邊e[u][v],我們從第u+n個點向第v個點建一條容量為inf的邊
從源點s向點1建一條容量為inf的邊
從點2n向匯點t建立一條容量為inf的邊
然后跑最大流即可
本題的特殊之處就在于先用最短路處理一下,剩下的步驟都是最大流常規操作了、
代碼:
總結
以上是生活随笔為你收集整理的网络流专题(最大流与费用流)例题总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网易信息
- 下一篇: 大小端模式的快速判断方法