T411218 挑选鱼鱼 II 题解
傻逼 dinic
uses math;
var
n, m, s, t, c, nx, ny, i, j, k, head, tail : longint;
h, d, eto, nxt, dx, dy, q : array[0..1000000] of longint;
x, inf, ans, v : int64;
val : array[0..1000000] of int64;
procedure init();
begin
dx[1] := 1;
dy[1] := 2;
dx[2] := 2;
dy[2] := 1;
dx[3] := 2;
dy[3] := -1;
dx[4] := 1;
dy[4] := -2;
dx[5] := -1;
dy[5] := -2;
dx[6] := -2;
dy[6] := -1;
dx[7] := -2;
dy[7] := 1;
dx[8] := -1;
dy[8] := 2;
inf := 1000000000000000000;
c := 1;
t := n * m + 1;
end;
function id(i : longint; j : longint) : longint;
begin
id := (i - 1) * m + j;
end;
procedure add(u : longint; v : longint; w : int64);
begin
c := c + 1;
eto[c] := v;
nxt[c] := h[u];
val[c] := w;
h[u] := c;
end;
function bfs() : boolean;
begin
fillchar(d, sizeof(d), 0);
head := 1;
tail := 1;
q[tail] := s;
d[s] := 1;
while head <= tail do begin
i := h[q[head]];
while i <> 0 do begin
if ((val[i] > 0) and (d[eto[i]] = 0)) then begin
d[eto[i]] := d[q[head]] + 1;
tail := tail + 1;
q[tail] := eto[i];
end;
i := nxt[i];
end;
inc(head);
end;
bfs := d[t] <> 0;
end;
function dfs(x : longint; r : int64) : int64;
begin
if (x = t) then begin
exit(r);
end;
i := h[x];
while i <> 0 do begin
if ((d[eto[i]] = d[x] + 1) and (val[i] <> 0)) then begin
v := dfs(eto[i], min(r, val[i]));
if (v > 0) then begin
val[i] -= v;
val[i xor 1] += v;
exit(v);
end;
end;
i := nxt[i];
end;
exit(0);
end;
begin
read(n, m);
init();
for i := 1 to n do begin
for j := 1 to m do begin
read(x);
ans := ans + x;
if ((i + j) mod 2 <> 0) then begin
add(id(i, j), t, x);
add(t, id(i, j), 0);
end else
add(s, id(i, j), x);
add(id(i, j), s, 0);
for k := 1 to 8 do begin
nx := i + dx[k];
ny := j + dy[k];
if ((nx >= 1) and (nx <= n) and (ny >= 1) and (ny <= m)) then
add(id(i, j), id(nx, ny), inf);
add(id(nx, ny), id(i, j), 0);
end;
end;
end;
while bfs() do begin
x := dfs(s, inf);
ans -= x;
end;
writeln(ans);
end.

浙公网安备 33010602011771号