\(w\) 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合 \(e = \,\)和進行這些實驗需要使用的全部儀器的集合 \(i=\\)。實驗 \(e_j\) 需要用到的儀器是 \(i\) 的子集 \(r_j \subseteq i\)。
配置儀器 \(i_k\) 的費用為 \(c_k\) 美元。實驗 \(e_j\) 的贊助商已同意為該實驗結果支付 \(p_j\) 美元。\(w\) 教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
第 \(1\) 行有 \(2\) 個正整數 \(m\) 和 \(n\)。\(m\) 是實驗數,\(n\) 是儀器數。接下來的 \(m\) 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的 \(n\) 個數是配置每個儀器的費用。
\(1<=n,m<=50\)
第 \(1\) 行是實驗編號,第 \(2\) 行是儀器編號,最後一行是淨收益。
最大權閉合圖問題,可以轉化為最小割問題,最小割所產生的兩個集合中,其源點\(s\)所在集合(除去\(s\))為最大權閉合圖,再變成最大流問題。
將所有實驗看作乙個頂點集合 \(x\),每個裝置看作頂點集合\(y\),構建二分圖\(g\)。並設定超級源點\(s\)和超級匯點\(t\)。
1.\(s\)向\(x\)中的每個頂點連線一條容量為該點點權的有向邊。
2.\(y\)中每個頂點向\(t\)連線一條容量為該點點權的有向邊
3.在原二分圖上的每條有向邊容量設定為無窮大。
(原自胡伯濤的**《最小割模型在資訊競賽中的運用》)
什麼是閉合圖?
在一張圖中,我們取乙個點集合\(v\),其中\(v\)中點所有的邊所指的終點也在\(v\)中,這樣的圖稱之為閉合圖。
很顯然,在該題中,如果做若干的實驗,再取對應的儀器,這樣構成的圖一定是閉合圖。所以我們取得的最大的閉合圖就是我們要求的方案。
最小割最大為所有非無窮邊的和,即最小割不包含容量為無窮的邊。即最小割為簡單割。
假設:簡單割\([s,t]\)將網路\(n\)的點集\(v_n\)劃分為點集\(s\)及其補集\(t\),滿足\(s\)在\(s\)中,\(t\)在\(t\)中。
設閉合圖\(v_1\),它在\(v\)中的補集為\(v_2\),\(v^+\)為\(v\)中點權為正的點集,\(v^-\)為\(v\)中點權為負的點集,在其他集合中也是如此。
證明:(1)閉合圖對應簡單割:
已知:\(s= v_1\cup\,t = v_2\cup\\),求證\([s,t]\)為簡單割。
假如有一條邊\(\),從\(v_1\)指向\(v_2\),使得\([s,t]\)含不與\(s\)或者\(t\)相關的邊。
此時,\(v_1\)有乙個後繼不在閉合圖內,矛盾。
(2)簡單割對應閉合圖:
證明\(v_1=s\)-\(\\)是閉合圖。\(v_1\)任意引出一條邊,因為簡單割不存在一條正無窮邊所以,這條邊的終點也在\(v_1\)中,符合閉合圖定義。
證明:對於簡單割:
割的容量\(c\)為連線到\(s\)的點的權值\(x_1\)加上連線到\(t\)的點的權值\(x_2\),其中點\(s\)只與正點相連,點\(t\)只與負點相連。
\((1)c = x_1+x_2\)
對於閉合圖:
閉合圖的權和\(w\)為正權點的權的絕對值\(w_1\)和減去負權點的權的絕對值和\(w_2\)。
\((2)w = w_1-w_2\)
可以得到\(x_2 = w_2\)(閉合圖中的負邊一定連線到\(t\)上)
相加可得 \(c+w = x_1+w_1\)
\(x_1+w_1\)即為所有正數的權值和,命名為\(tot\)。
得\(w = tot-c\)。
跑出最小割\(c\),統計正數點權權值和\(tot\),得出答案\(w\)
輸出方案的解釋源自洛谷紅名大佬 huangzirui:
假如我們跑的是 dinic 那麼我們最後一次網路流(這一次網路流並沒有起任何作用,只是確認了無更多殘餘流量可以退出了。)中所有被分到層的都一定被選上了。
沒有更多殘餘流量其實意味著這個圖已經被割成了兩部分,乙個實驗如果有層數意味著它沒有被割掉(被選上了),乙個儀器如果有層數意味著它已經被割掉了(也是被選上了)。
於是只要在最後輸出所有有層數的點就行了。
#include#include#include#include#includeusing namespace std;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int maxn=210;
const int maxm = 5e3+10;
ll level[maxn],head[2*maxm],cur[2*maxm],cnt;
ll n,m;
ll ss,ee;
struct edgeedge[2*maxm];
void init()
void add(ll u,ll v,ll w)
void add2(ll u,ll v,ll w,bool op)
bool bfs(ll s,ll t)}}
return false;
}ll dfs(ll u,ll maxf,ll t)
}if(!ret)level[u]=-1;//優化,防止重搜,說明u這一路不可能有流量了
return ret;
}ll dinic(ll s,ll t)
int main()
ll ans = dinic(0,n+m+1);
for(ll i = 1;i <= m;i++) if(level[i]>0)cout<0)cout
}
網路流 24 題
1 搭配飛行員 題意 n個飛行員,其中有m名飛行員是正駕駛員。飛機每架有兩個駕駛員,需乙個正駕駛員和乙個副駕駛員。由於種種原因,例如相互配合的問題,有些駕駛員不能在同一架飛機上飛行,問如何搭配駕駛員才能使出航的飛機最多。思路 裸二分圖匹配 最大流 題 版本一 網路流做法 引入源點s 0以及匯點t n...
網路流24題
學會網路流演算法後,我們要做的就是把問題轉化成網路流問題。求二分圖最大匹配。網路流建模要找到問題的關鍵特點,用連邊,流量 以及費用 把原問題轉化成網路流問題,包括最大流,最小割,費用流。二分圖最大匹配的特點是每個點最多屬於一條匹配邊。這相當於是說,每個點只能流過一次。要求的是最大匹配,可以得出建模為...
網路流24題
經典問題,做了一部分 太水的就不記錄了 最大流是對於一種完整的匹配的處理,一條路乙個貢獻。要求匹配盡可能多。費用流是對於乙個路徑的最值的處理,每條邊自己的費用。再匹配最多前提下,匹配的費用達到最值。難點就是對於條件狀態的設計 網路流24題 餐巾計畫問題 費用流建模 考慮每天一定有ri條髒毛巾,所以髒...