洛谷P4843 清理雪道 有上下界最小流

2021-09-12 13:03:08 字數 1993 閱讀 7232

時空限制 1000ms / 128mb

題目描述

滑雪場坐落在fj省西北部的若干座山上。

從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡(即雪道),弧的方向代表斜坡下降的方向。

你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行,並清理他所經過的雪道。

由於每次飛行的耗費是固定的,為了最小化耗費,你想知道如何用最少的飛行次數才能完成清理雪道的任務。

輸入格式:

輸入檔案的第一行包含乙個整數n (2 <= n <= 100) – 代表滑雪場的地點的數量。

接下來的n行,描述1~n號地點出發的斜坡,第i行的第乙個數為mi (0 <= mi < n) ,後面共有mi個整數,由空格隔開,每個整數aij互不相同,代表從地點i下降到地點aij的斜坡。每個地點至少有乙個斜坡與之相連。

輸出格式:

輸出檔案的第一行是乙個整數k – 直公升飛機的最少飛行次數。

題目分析

算是有上下界最小流裸題吧

對於每條雪道,至少清理一次,可以反覆經過,所以原圖中每條邊在網路中下界為1,上界為inf

建立虛擬源點s,向每個點連邊,下界0,上界inf

每個點向虛擬匯點t連邊,下界0,上界inf

分別表示每個點可以反覆降落,也可以在這裡結束清理

按有上下界的網路流建圖即可

(因為一些弱智錯誤調了一萬年)

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long lt;

intread()

while

(ss>=

'0'&&ss<=

'9')

return f*x;

}const

int inf=

1e9;

const

int maxn=

50010

;int n;

struct nodee[maxn<<1]

;int head[maxn]

,tot=1;

int deg[maxn]

,lev[maxn]

;void

add(

int u,

int v,

int f)

intbfs

(int s,

int t)}}

return0;

}int

dfs(

int u,

int cap,

int t)

}return cap-flow;

}int

dicnic

(int s,

int t)

intmain()

}int s=n+

1,t=n+2;

for(

int i=

1;i<=n;

++i)

int ss=n+

3,tt=n+4;

for(

int i=

1;i<=n;

++i)

add(t,s,inf)

;add

(s,t,0)

;dicnic

(ss,tt)

;int ans=e[tot]

.f; head[t]

=e[head[t]

].nxt;

head[s]

=e[head[s]

].nxt;

printf

("%d"

,ans-

dicnic

(t,s));

return0;

}

洛谷 P4843 清理雪道 有上下界最小流

題目描述 滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜...

洛谷P4843 清理雪道

滑雪場坐落在fj省西北部的若干座山上。從空中鳥瞰,滑雪場可以看作乙個有向無環圖,每條弧代表乙個斜坡 即雪道 弧的方向代表斜坡下降的方向。你的團隊負責每週定時清理雪道。你們擁有一架直公升飛機,每次飛行可以從總部帶乙個人降落到滑雪場的某個地點,然後再飛回總部。從降落的地點出發,這個人可以順著斜坡向下滑行...

洛谷4843 BZOJ2502 清理雪道

有源匯有上下界的最小可行流。yy一下建圖應該很好搞吧 就是對於每個雪道都是 1,inf 然後源點到所有點都是 0,inf 所有點到匯點都是 0,inf 這樣的話跑乙個有源匯上下界最小可行流就可以了 有關於這個可以看liu runda神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...