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.
posted @ 2023-12-27 18:03  haokee  阅读(18)  评论(0)    收藏  举报