#include<bits/stdc++.h>
#define maxn 1010
using namespace std;
int n,m,a[maxn][maxn],num[maxn][maxn];
int dis[maxn],h[maxn],tot=1;
int totflow,cnt;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int s,t;
struct node
{
int c,v,next;
}e[maxn*100];
void add(int u,int v,int c)
{
tot++;
e[tot].c=c;
e[tot].v=v;
e[tot].next=h[u];
h[u]=tot;
}
int bfs()
{
queue<int> q;
q.push(s);
memset(dis,-1,sizeof(dis));
dis[s]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(e[i].c>0&&dis[v]<0)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
if(dis[t]>0) return true;
}
return dis[t]>0;
}
int dfs(int u,int flow)
{
if(u==t) return flow;
int res=0;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;
if(dis[v]==dis[u]+1&&e[i].c>0)
{
int tmp=dfs(v,min(flow,e[i].c));
if(tmp>0)
{
res+=tmp;
flow-=tmp;
e[i^1].c+=tmp;
e[i].c-=tmp;
if(flow<=0) break;
}
}
}
if(res==0) dis[u]=-1;
return res;
}
void dinic()
{
totflow=0;
while(bfs())
{
totflow+=dfs(s,1<<30);
}
return ;
}
int main()
{
scanf("%d%d",&n,&m);
s=n*m+1,t=n*m+2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++) scanf("%d",&a[i][j]);
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cnt++;
if(a[i][j]==1) add(s,cnt,1<<30),add(cnt,s,0);
if(a[i][j]==2) add(cnt,t,1<<30),add(t,cnt,0);
num[i][j]=cnt;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=0;k<4;k++)
{
int tx=i+dx[k];
int ty=j+dy[k];
if(tx>=1&&ty>=1&&tx<=n&&ty<=m)
{
add(num[i][j],num[tx][ty],1);
add(num[tx][ty],num[i][j],0);
}
}
}
}
dinic();
printf("%d",totflow);
return 0;
}
不知道那里写错了,求救