洛谷P4843 清理雪道

2021-10-09 02:14:56 字數 1717 閱讀 6656

滑雪場坐落在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神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...