P2030 BJOI2006 狼抓兔子

2022-05-11 03:18:25 字數 1899 閱讀 1094

左上角點為(1,1),右下角點為(n,m)(上圖中n=4,m=5).有以下三種型別的道路 

1:(x,y)<==>(x+1,y) 

2:(x,y)<==>(x,y+1) 

3:(x,y)<==>(x+1,y+1) 

道路上的權值表示這條路上最多能夠通過的兔子數,道路是無向的. 左上角和右下角為兔子的兩個窩,開始時所有的兔子都聚集在左上角(1,1)的窩裡,現在它們要跑到右下解(n,m)的窩中去,狼王開始伏擊這些兔子.當然為了保險起見,如果一條道路上最多通過的兔子數為k,狼王需要安排同樣數量的k只狼,才能完全封鎖這條道路,你需要幫助狼王安排乙個伏擊方案,使得在將兔子一網打盡的前提下,參與的狼的數量要最小。因為狼還要去找喜羊羊麻煩.

第一行為n,m.表示網格的大小,n,m均小於等於1000.接下來分三部分 第一部分共n行,每行m-1個數,表示橫向道路的權值.

第二部分共n-1行,每行m個數,表示縱向道路的權值. 第三部分共n-1行,每行m-1個數,表示斜向道路的權值. 輸入保證不超過10m

輸出乙個整數,表示參與伏擊的狼的最小數量.

3 4 

5 6 4 

4 3 1 

7 5 3 

5 6 7 8 

8 7 6 5 

5 5 5 

6 6 6

圖論,搜尋,最短路徑

暴力就是裸地最大流,但點數與邊數都達到了很大的級別,普通的網路流也過不去;可以發現這個題的圖是乙個平面圖:邊不會交叉;有乙個性質,就是在原圖g中,s

與t再連一條邊得到的較小的那個平面作為

s』,最大的面

(另乙個面)作為

t』,做出對偶圖:原圖中所有面看為點,所有邊所相鄰的兩個面在對偶圖所對應的點連一條邊,然後從g』中

s到t的最短路就是原圖的最大流;證明略;

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11 #include12 #include

13 #include14

#define ll long long

15#define rep(i,a,b) for(register int i=a;i<=b;i++)

16#define inf 1<<29

17#define re register

18using

namespace

std;

19const

int n=1000*1000*2,m=1000*1000*3;20

struct

edgee[m*2

];23

int head[n],num_e=-1

,n,m;

24int

s,t;

25int g[1001][1001][2

];26 inline int

gi()

33 inline void add(int x,int y,int

w) 36

bool

inq[n];

37int

dis[n];

38int

spfa() 54}

55}56return

dis[t];57}

58int

main()

76 rep(i,1,n-1

)77 rep(j,1

,m)

84 rep(i,1,n-1

)85 rep(j,1,m-1

) 90

//cout<

91 printf("%d"

,spfa());

92return0;

93 }

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...

BJOI2006 狼抓兔子

求乙個網格圖的最小割。這個題一看就知道是乙個最小割模型,於是就快樂的打了dinic,也就快樂的tle了。查了查資料才知道,這個題要用到對偶圖的知識 平面圖最小割對應對偶圖最短路。所謂對偶圖,就是以原圖中的面作為點 將s,t連線以將無界區域分成兩部分 原圖中的邊在對偶圖中變為連線相鄰的面,於是,顯然對...