網絡流24題

題目列表:
<最大流有FF、EK、Dinic算法,最小費用流有SPFA、DIjkstra求解算法等,網絡流在於建模,在此不在貼出代碼>

P2756 飛行員配對方案問題

  • 二分圖最大匹配(匈牙利算法),看着模板一頓亂敲即可。

P4016 負載平衡問題

  • 最小費用流
  • 建模:源點s=0,匯點t=n+1,平均值ave(對於樣例爲12)
    1. 源點s向節點i(i的值s[i]>平均值ave)連邊,花費0,容量s[i]-ave。
    2. 節點i(i的值s[i]>平均值ave)向節點j(j的值s[j]<平均值ave)連邊,花費爲節點i和j的順逆中的最短距離,容量s[i]-ave。
    3. 節點j(j的值s[j]<平均值ave)向匯點連邊,花費0,容量ave-s[j]。

P1251 餐巾計劃問題

  • 最小費用流
  • 建模:源點s,匯點t,第i天爲節點i。add_edge(from,to,cost,cap)。
    1. 對於節點i,每天都可以直接購買今天所需的餐巾數,連邊:add_edge(s,i,p,num[i]) 。每天都需要num[i]數量的餐巾數,即保證每天向匯點t流入num[i]流量,連邊:add_edge(i,t,0,num[i])。
    2. 節點i的餐巾可以經過快洗/慢洗送給節點i+m/i+n使用。這就表明了:
      ①從節點i流向節點i+m/i+n的容量必爲num[i]。
      ②由於從源點s流向節點i的容量爲num[i],而節點i流向節點i+m/i+n容量爲num[i],流向匯點t的容量也爲num[i],不滿足一定可以向節點i+m/i+n流容量num[i]。
      所以,對節點i進行拆點,拆爲i和i+N,拆點之後直接從匯點s向i+N連邊,不經過節點i。
    3. 源點s=0,匯點t=2*N+1。
      源點s向節點i+n連邊,容量爲num[i],即:add_edge(s,i+N,0,num[i]),保證了條件2。
      同時節點i的餐巾可以經過快洗/慢洗送給節點i+m/i+n使用,分別連邊:add_edge(i+N,i+m,f,inf);add_edge(i+N,i+n,s,inf)。
    4. 節點i的餐巾只需送給第i+m/i+n個節點就好,然後分別在節點之間連邊,add_edge(i,i+1,0,inf);表明今天剩餘的餐巾可以留到下一天用。
// 建模代碼:
int st=0,ed=2*N+1;
for(int i=1;i<=N;i++){
	add_edge(st,i,p,num[i]);
	add_edge(i,ed,0,num[i]);
	add_edge(st,N+i,0,num[i]);
	if(i+1<=N)add_edge(i,i+1,0,inf);
	if(i+m<=N)add_edge(N+i,i+m,f,inf);
	if(i+n<=N)add_edge(N+i,i+n,s,inf); 
}
printf("%lld\n",min_cost_flow(st,ed));

P2761 軟件補丁問題

  • 最短路(說好的網絡流24題吶!),狀態用二進制壓縮一下。
    對於樣例n=3,起點狀態:111 終點爲:000
    對於狀態u可以依次判斷是否和1~m個補丁相容,進而進行狀態轉移。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章