滑雪場坐落在fj省西北部的若干座山上。
從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。
你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。
由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。
輸入檔案的第一行包含乙個整數n (2 <= n <= 100) – 代表滑雪場的地點的數量。接下來的n行,描述1~n號地點出發的斜坡,第i行的第乙個數為mi (0 <= mi < n) ,後面共有mi個整數,由空格隔開,每個整數aij互不相同,代表從地點i下降到地點aij的斜坡。每個地點至少有乙個斜坡與之相連。
輸出檔案的第一行是乙個整數k – 直公升飛機的最少飛行次數。
並不是上下界網路流。
不拆點不二分。
統計邊數m。
建立源點s到每個點的邊,流量為inf,費用為0
每個點到匯點t的邊,流量為inf,費用為0
按照原圖建兩條邊,一條流量為1,費用為1;一條流量為inf,費用為0
然後直接跑最大費用最大流。
在做增廣的過程中,一旦費用=m(即邊都經過)就輸出答案即當前流量。
很明顯增廣路費用有單調性,每次都會取當前的最優增廣路。
那麼我們能夠保證在m條邊都被遍歷時增廣次數最少。
那麼建圖應該就很明顯了,s和t不用多說,原圖的一條邊記清理與否,另一條邊就是原圖。
#include
#define maxn 200000
#define inf int_max
using
namespace std;
struct edgee[maxn]
;bool vis[maxn]
;int n,m,cnt=
0,mc=
0,mf=0;
int head[maxn]
,pre[maxn]
,sum[maxn]
;inline
void
add(
int a,
int b,
int c,
int d)
inline
voidad(
int a,
int b,
int c,
int d)
void
init()
bool
spfa
(int s,
int t)
sum[s]=0
; vis[s]=1
; q.
push
(s);
while
(!q.
empty()
)}}}
return sum[t]
!=inf;
}voidek(
int s,
int t)
//cout(mc==
-m)}
}int
main()
};int s=
0,t=n+1;
ek(s,t);}
/*10
1 21 3
1 42 10 5
1 61 7
01 9
1 40
*/
洛谷 P4843 清理雪道 有上下界最小流
題目描述 滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜...
洛谷P4843 清理雪道 有上下界最小流
時空限制 1000ms 128mb 題目描述 滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部...
洛谷4843 BZOJ2502 清理雪道
有源匯有上下界的最小可行流。yy一下建圖應該很好搞吧 就是對於每個雪道都是 1,inf 然後源點到所有點都是 0,inf 所有點到匯點都是 0,inf 這樣的話跑乙個有源匯上下界最小可行流就可以了 有關於這個可以看liu runda神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...