1458 士兵占領 BZOJ

2022-09-17 05:24:13 字數 3108 閱讀 6937

description

有乙個m * n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士兵占領了整個棋盤當滿足第i行至少放置了li個士兵, 第j列至少放置了cj個士兵。現在你的任務是要求使用最少個數的士兵來占領整個棋盤。

input

第一行兩個數m, n, k分別表示棋盤的行數,列數以及士兵的個數。 第二行有m個數表示li。 第三行有n個數表示ci。 接下來有k行,每行兩個數x, y表示(x, y)這個格仔是障礙。

output

輸出乙個數表示最少需要使用的士兵個數。如果無論放置多少個士兵都沒有辦法占領整個棋盤,輸出」jiong!」 (不含引號)

sample input

4 4 4

1 1 1 1

0 1 0 3

1 42 2

3 34 3

sample output

資料範圍

m, n <= 100, 0 <= k <= m * n

看資料範圍,應該可以用網路流吧,但是他要最小化,於是我們就機智地轉換成先填滿然後最大限度的拿掉士兵就行了

每一列建乙個點,每一行建乙個點,能拿掉的士兵就從對應的行向列連一條容量為1的邊,行和列加上容量限制(就是最多可以拿掉多少)

1

const

2 maxn=110;3

var4 map:array[0..maxn*2,0..maxn*2]of

longint;

5 dis,his,vh,pre:array[0..maxn*2]of

longint;

6n,m,k,s,t,flow:longint;78

procedure

init;

9var

10i,j,x,y:longint;

11begin

12read(n,m,k);

13 s:=0

;14 t:=n+m+1;15

for i:=1

to n do

16begin

17read(map[s,i]);

18 map[s,i]:=m-map[s,i];

19end;20

for i:=1

to m do

21begin

22 read(map[i+n,t]);

23 map[i+n,t]:=n-map[i+n,t];

24end;25

for i:=1

to n do

26for j:=1

to m do

27 map[i,j+n]:=1;28

for i:=1

to k do

29begin

30read(x,y);

31 dec(map[x,y+n]);

32dec(map[s,x]);

33 dec(map[y+n,t]);

34if (map[s,x]<0) or (map[y+n,t]<0) then

35begin

36 writeln('

jiong!');

37halt;

38end;39

end;

40end;41

42procedure

sap;

43var

44i,j,min,aug:longint;

45flag:boolean;

46begin

47 vh[0]:=t+1

;48 aug:=maxlongint;

49 i:=0;50

while dis[i]<=t do

51begin

52 his[i]:=aug;

53 flag:=false;

54for j:=0

to t do

55if (dis[j]+1=dis[i]) and (map[i,j]>0) then

56begin

57 flag:=true;

58if aug>map[i,j] then aug:=map[i,j];

59 pre[j]:=i;

60 i:=j;

61if i=t then

62begin

63inc(flow,aug);

64while i<>s do

65begin

66inc(map[i,pre[i]],aug);

67dec(map[pre[i],i],aug);

68 i:=pre[i];

69end

;70 aug:=maxlongint;

71end;72

break;

73end;74

if flag then

continue;

75 min:=t;

76for j:=0

to t do

77if (map[i,j]>0) and (dis[j]then min:=dis[j];

78dec(vh[dis[i]]);

79if vh[dis[i]]=0

then

break;

80 dis[i]:=min+1

;81 inc(vh[min+1

]);82

if i<>s then

83begin

84 i:=pre[i];

85 aug:=his[i];

86end;87

end;

88 writeln(n*m-k-flow);

89end;90

91begin

92init;

93sap;

94end.

view code

BZOJ 1458 士兵占領

time limit 10 sec memory limit 64 mb submit 632 solved 366 submit status discuss description 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不...

bzoj 1458 士兵占領

time limit 10 sec memory limit 64 mb submit 784 solved 458 submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...

bzoj1458 士兵占領

time limit 10 sec memory limit 64 mb submit 685 solved 398 submit status discuss 有乙個m n的棋盤,有的格仔是障礙。現在你要選擇一些格仔來放置一些士兵,乙個格仔裡最多可以放置乙個士兵,障礙格里不能放置士兵。我們稱這些士...