感谢
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
const int Inf = 210000000;
const int N = 110;
const int M = 1e5 + 10;
int zx[5] = {0, 0, 0, -1, 1};
int zy[5] = {0, 1, -1, 0, 0};
int n, m ,t[N][N];
int rt1, rt2;
int Next[M << 1], head[M << 1], e[M << 1], v[M << 1], idx = 1;
void add(int a, int b, int c){
e[++ idx] = b; Next[idx] = head[a]; head[a] = idx; v[idx] = c;
}
int dep[N], q[N], l, r;
bool bfs(){
memset(dep, 0, sizeof dep);
l = r = 1;
q[1] = rt1;
dep[rt1] = 1;
while(l <= r){
int u = q[l ++];
for(int i = head[u]; i; i = Next[i]){
int j = e[i];
if(v[i] && !dep[j]){
dep[j] = dep[u] + 1;
q[++ r] = j;
}
}
}
return dep[rt2];
}
int dfs(int u, int in){
if(u == rt2) return in;
int out = 0;
for(int i = head[u]; i && in; i = Next[i]){
int j = e[i];
if(v[i] && dep[j] == dep[u] + 1){
int res = dfs(j, min(v[i], in));
v[i] -= res;
v[i ^ 1] += res;
in -= res;
out += res;
}
}
if(out == 0) dep[u] = 0;
return out;
}
int ans;
int hsh(int a, int b){
return (a - 1) * m + b;
}
signed main(){
scanf("%lld%lld", &n, &m);
rt1 = (n * m) + 1;
rt2 = (n * m) + 2;
for(int i = 1; i <= n; ++ i)
for(int j = 1; j <= m; ++ j)
scanf("%lld", &t[i][j]);
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= m; ++ j){
if(t[i][j] == 1){
add(rt1, hsh(i, j), Inf);
add(hsh(i, j), rt1, 0);
}
else if(t[i][j] == 2){
add(hsh(i, j), rt2, Inf);
add(rt2, hsh(i, j), 0);
}
}
}
for(int i = 1; i <= n; ++ i){
for(int j = 1; j <= m; ++ j){
for(int k = 1; k <= 4; ++ k){
if(i + zx[k] <= n && i + zx[k] >= 1 && j + zy[k] >= 1 && j + zy[k] <= m){
add(hsh(i, j), hsh((i + zx[k]), (j + zy[k])), 1);
add(hsh((i + zx[k]), (j + zy[k])), hsh(i, j), 0);
}
}
}
}
while(bfs()) ans += dfs(rt1, 1e18);
printf("%lld\n", ans);
return 0;
}