BZOJ1001 狼抓兔子

2022-08-12 16:24:14 字數 4087 閱讀 8119

【題目描述】

現在小朋友們最喜歡的"喜羊羊與灰太狼",話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形:  左上角點為(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 45 6 4

4 3 1

7 5 3

5 6 7 8

8 7 6 5

5 5 5

6 6 6

【輸出樣例】

14【題目分析】

我首先表示這個題我不是自己做出來的= =,看了網上的題解才會。

這個題的模型是最小割,然後轉化成最短路的模型來解(最大流演算法不足以解決這麼多點的流)

最小割的模型比較簡單,就是如圖所示的圖做一遍最大流就行了。

根據周冬的**……乙個平面圖的最小割可以轉化成它的對偶圖的最短路來做(有不對之處請大牛指正),於是重新構圖,虛擬乙個源點和乙個終點 ,把每個三角形作為點,有公共邊就連邊,有左邊界或下邊界的與源點連邊,有上邊界和右邊界的與終點連邊,做一遍最短路就行了。

【**實現】

code

1

program

aaa;

2const maxn=5000000;3

type bian=record

4y,next,l:longint;

5end;6

var a:array[0..6000000]of

bian;

7 dist,d,g:array[0..2000000]of

longint;

8 b:array[0..1000,0..1000,0..1]of

longint;

9 v:array[0..2000000]of

boolean;

10i,j,m,n,ans,x,y,l,tot,sum,tt:longint;

11procedure

insert(x,y,l:longint);

12begin

13inc(tot);

14 a[tot].y:=y;

15 a[tot].l:=l;

16 a[tot].next:=g[x];

17 g[x]:=tot;

18end;19

procedure

spfa;

20var

t,w,i,j,x:longint;

21begin

22 fillchar(dist,sizeof(dist),63

);23 d[0]:=0;t:=0;w:=0;v[0]:=true;dist[0]:=0;24

while t<>w+1

do25

begin

26 x:=d[t];inc(t);v[x]:=false;

27if t=maxn then t:=0

;28 i:=g[x];

29while i<>0

do30

begin

31 j:=a[i].y;

32if dist[x]+a[i].lthen

33begin

34 dist[j]:=dist[x]+a[i].l;

35if

not v[j] then

36begin

37if dist[j]then

38begin

39dec(t);

40if t=-1

then t:=maxn-1

;41 d[t]:=j;

42end

43else

44begin

45inc(w);

46if w=maxn then w:=0

;47 d[w]:=j;

48end

;49 v[j]:=true;

50end;51

end;

52 i:=a[i].next;

53end;54

end;

55end;56

begin

57readln(m,n);

58for i:=1

to m-1

do59

for j:=1

to n-1

do60

begin

61inc(sum);

62 b[i,j,0]:=sum;

63inc(sum);

64 b[i,j,1]:=sum;

65end

;66 tt:=sum+1;67

for i:=1

to m do

68for j:=1

to n-1

do69

begin

70read(x);

71if i=1

then insert(b[i,j,1

],tt,x);

72if i=m then insert(0,b[i-1,j,0

],x);

73if (i<>1)and(i<>m) then

74begin

75 insert(b[i,j,1],b[i-1,j,0

],x);

76 insert(b[i-1,j,0],b[i,j,1

],x);

77end;78

end;

79for i:=1

to m-1

do80

for j:=1

to n do

81begin

82read(x);

83if j=1

then insert(0,b[i,j,0

],x);

84if j=n then insert(b[i,j-1,1

],tt,x);

85if (j<>1)and(j<>n) then

86begin

87 insert(b[i,j,0],b[i,j-1,1

],x);

88 insert(b[i,j-1,1],b[i,j,0

],x);

89end;90

end;

91for i:=1

to m-1

do92

for j:=1

to n-1

do93

begin

94read(x);

95 insert(b[i,j,0],b[i,j,1

],x);

96 insert(b[i,j,1],b[i,j,0

],x);

97end;98

spfa;

99writeln(dist[tt]);

100end.

BZoj1001狼抓兔子

description 現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,它們只有兩個窩,現在你做為狼王,面對下面這樣乙個網格的地形 左上角點為 1,1 右下角點為 n,m 上圖中n 4,m 5 有以下三種型別的道路 1 x,y x 1,y 2...

bzoj1001 狼抓兔子

time limit 15 sec memory limit 162 mb submit 12719 solved 3017 submit status discuss description 現在小朋友們最喜歡的 喜羊羊與灰太狼 話說灰太狼抓羊不到,但抓兔子還是比較在行的,而且現在的兔子還比較笨,...

BZOJ 1001 狼抓兔子

參考 本題的題解 還有那篇平面圖網路流的 兩極相通 最大 最小定理在資訊學競賽中的應用 兩篇足夠了。pragma comment include include include include using namespace std define mp i,j make pair i,j defin...