模型:無源匯有上下界可行流ljn:模板題吧滑雪場坐落在fj省西北部的若干座山上。
從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。
由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。
輸入檔案的第一行包含乙個整數n (2 <= n
<= 100) – 代表滑雪場的地點的數量。接下來的n行,描述1~n號地點出發的斜坡,第i行的第乙個數為mi
(0 <= mi
個整數,由空格隔開,每個整數aij
互不相同,代表從地點i下降到地點aij
的斜坡。每個地點至少有乙個斜坡與之相連。
輸出檔案的第一行是乙個整數k – 直公升飛機的最少飛行次數。
題目的限制相當於這樣額外連邊:對於$(u,v)$若$u$在原圖上可到達$v$,那麼存在一條$(v,u)$的費用為1的邊。現在求使每條邊至少經過一次的(流量守恆的)可行流。
這個模型就是最小費用無源匯有上下界可行流(迴圈流)。參考:
有上下界的網路流學習筆記。
這裡提供一幅簡單的圖供以理解。
先在原圖中跑一趟最大流,將邊(tt,ss)的流量作為初始答案。再在此增廣的基礎上,刪去s,t和邊(tt,ss),並以tt為超級源、ss為超級匯跑一趟最大流。答案即是初始答案減去第二次的最大流。第二次在割去(tt,ss)之後之所以還有流量,是因為tt沿著反向弧向ss方向更新了最大流量。
可以這麼說:因為整張圖滿足流量平衡,所以tt點流入的流量=流出的流量。而tt沿著反向弧向ss方向更新的最大流量,就是ss到tt減少最多的流量。因此兩者相減就是全圖的最小流。
或許這個操作叫做無源匯最小流?
1 #include2endconst
int maxn = 203;3
const
int maxm = 200035;4
const
int inf =2e9;56
struct
edge710
}edges[maxm];
11int
n,s,t,ss,tt,ans;
12int
edgetot,head[maxn],nxt[maxm],lv[maxn];
1314
intread()
1524
void addedge(int u, int v, int
c)25
29bool
buildlevel()
3044}45
}46return
false;47
}48int fndpath(int x, int
lim)
49else lv[v] = -1;59
}60}61
return0;
62}63int
dinic()
6470
intmain()
7183}84
addedge(tt, ss, inf);
85dinic();
86 ans = -edges[edgetot-1
].f;
87for (int i=head[s]; i!=-1; i=nxt[i]) edges[i].c = edges[i^1].c = edges[i].f = edges[i^1].f = 0;88
for (int i=head[t]; i!=-1; i=nxt[i]) edges[i].c = edges[i^1].c = edges[i].f = edges[i^1].f = 0
;89 edges[edgetot-1].f = edges[edgetot-2].f = edges[edgetot-1].c = edges[edgetot-2].c = 0
;90 s = tt, t =ss;
91 ans -=dinic();
92 printf("
%d\n
",ans);
93return0;
94 }
BZOJ 2502 清理雪道 上下界網路流
description 滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。由...
bzoj2502 清理雪道 上下界網路流
滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行...
bzoj2502 清理雪道 有上下界的網路流
發現了一種不錯的最小流求法。有源匯的最小流 源點s向每個點連一條容量為 0,inf 的邊 每個點向匯點t連一條容量為 0,inf 的邊 原圖的每條邊變成容量為 1,inf 的邊 最小流求法 二分乙個答案,每次在s到t間連一條容量為 0,x 的邊 判斷是否可行 include include incl...