時空限制 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神犇的介紹 非常直觀易懂 最開始先建超級源匯 跑可行流得到乙個基礎流...