rt,全wa了
#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define INF 1145141919
namespace Dinic {
struct Node {
int to,nxt,dis;
}e[100001];
int tot=1,s,t,head[10001],cur[10001],vis[10001];
void add(int x,int y,int k) { e[++tot]=(Node){y,head[x],k},head[x]=tot; }
bool bfs() {
memset(vis,0,sizeof vis); vis[s]=1;
std::queue<int> q; q.push(s);
while (!q.empty()) {
int x=q.front(); q.pop();
for (int i=head[x];i;i=e[i].nxt) {
int y=e[i].to; cur[x]=head[x];
if (e[i].dis and !vis[y]) {
vis[y]=vis[x]+1;
q.push(y);
}
}
}
return vis[t];
}
int dfs(int x,int flow) {
// printf("1\n");
if (x==t) return flow;
int res=0;
for (int i=cur[x];i and flow;i=e[i].nxt) {
int y=e[i].to; cur[x]=i;
if (e[i].dis and vis[y]==vis[x]+1) {
int k=dfs(y,std::min(e[i].dis,flow));
e[i].dis-=k,e[i^1].dis+=k,res+=k,flow-=k;
}
}
return res;
}
}
using namespace Dinic;
using namespace std;
int n,m,ans;
int x[1001][1001];
int main() {
scanf("%d%d",&n,&m); t=n*m+1;
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
scanf("%d",&x[i][j]);
if (x[i][j]==1) add(s,(i-1)*m+j,INF),add((i-1)*m+j,s,0);
else add((i-1)*m+j,t,INF),add(t,(i-1)*m+j,0);
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++) {
if (i+1<=n) add((i-1)*m+j,i*m+j,1),add(i*m+j,(i-1)*m+j,0);
if (i-1>0) add((i-1)*m+j,(i-2)*m+j,1),add((i-2)*m+j,(i-1)*m+j,0);
if (j+1<=m) add((i-1)*m+j,(i-1)*m+j+1,1),add((i-1)*m+j+1,(i-1)*m+j,0);
if (j-1>0) add((i-1)*m+j,(i-1)*m+j-1,1),add((i-1)*m+j-1,(i-1)*m+j,0);
}
while (bfs()) ans+=dfs(s,INF);
printf("%d\n",ans);
return 0;
}