現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形:
左上角點為(1,
1)(1,1)
(1,1
),右下角點為(n,
m)(n,m)
(n,m
)(上圖中n=3
,m=4
n=3,m=4
n=3,m=
4)。有以下三種型別的道路
( x,
y)<==
>(x
+1,y
)(x,y)<==>(x+1,y)
(x,y
)<==
>(x
+1,y)(x
,y)<==
>(x
,y+1
)(x,y)<==>(x,y+1)
(x,y
)<==
>(x
,y+1)(x
,y)<==
>(x
+1,y
+1)(x,y)<==>(x+1,y+1)
(x,y
)<==
>(x
+1,y
+1)道路上的權值表示這條路上最多能夠通過的兔子數,道路是無向的. 左上角和右下角為兔子的兩個窩,開始時所有的兔子都聚集在左上角(1,
1)(1,1)
(1,1
)的窩裡,現在它們要跑到右下角(n,
m)(n,m)
(n,m
)的窩中去,狼王開始伏擊這些兔子.當然為了保險起見,如果一條道路上最多通過的兔子數為k
kk,狼王需要安排同樣數量的k
kk只狼,才能完全封鎖這條道路,你需要幫助狼王安排乙個伏擊方案,使得在將兔子一網打盡的前提下,參與的狼的數量要最小。因為狼還要去找喜羊羊麻煩。
最小割等於最大流。
然後就是一道板子題了。注意這道題的邊是雙向的,所以反向邊和正向邊的流量是一樣的。
點數1 06
10^6
106,最好加上當前弧優化。
#include
#include
#include
#include
#include
using
namespace std;
const
int n=
1000010
,inf=
1e9;
int n,m,tot=
1,s,t,maxflow,head[n]
,cur[n]
,dep[n]
;bool vis[n]
;struct edge
e[n*6]
;intc(
int x,
int y)
intread()
void
add(
int from,
int to,
int flow)
bool
bfs()}
}return dep[t]
}int
dfs(
int x,
int flow)
int used=0;
for(
int i=cur[x]
;~i;i=e[i]
.next)}}
return used;
}void
dinic()
intmain()
for(
int i=
1;i)for
(int j=
1;j<=m;j++
)for
(int i=
1;i)for
(int j=
1;j)add
(s,1
,inf)
;add(1
,s,0);
add(
c(n,m)
,t,inf)
;add
(t,c
(n,m),0
);dinic()
;printf
("%d"
,maxflow)
;return0;
}
洛谷P4001 狼抓兔子 網路流
現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形 左上角點為 1,1 1 1 右下角點為 n,m n m 上圖中n 3 m 4 n 3,m 4 有以下三種型別的道路 x y x 1,y...
P4001 BJOI2006 狼抓兔子
不少題解都是用網路流來做最小割 網路流是什麼 但對於乙個不會網路流的蒟蒻來做這題相當困難。聽機房daolao說可以重構圖做最短路。然後就baidu將平面圖轉換成乙個對偶圖,因為網路流的最小割 對偶圖的最短路,所以只要在對偶圖上跑最短路 從左上角跑到右下角 就行了。由於堆優化的dijkstra寫炸了,...
BJOI2006 狼抓兔子(網路流)
現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形 左上角點為 1,1 右下角點為 n,m 上圖中n 3,m 4 有以下三種型別的道路 1 x,y x 1,y 2 x,y x,y 1 3...