rt,调不出来了,帮帮我吧QAQ
#include<iostream>
#include<cstdio>
#include<cstring>
#define foir(i,l,r) for (register int i=l;i<=r;++i)
#define fopr(i,l,r) for (register int i=l;i>=r;--i)
#define maxn 110
#define maxn2 100010
#define inf (1<<29)
using namespace std;
inline int read()
{
int x=0;bool f=0;char c=getchar();
while (!isdigit(c)) f|=c=='-',c=getchar();
while (isdigit(c)) x=(x<<1)+(x<<3)+(c^48),c=getchar();
return f?-x:x;
}
int n,m,s,t;
int front[maxn2],to[maxn2<<3],nxt[maxn2<<3],cap[maxn2<<3];
int a[maxn][maxn];
namespace prework
{
int tot=1;
inline void link(int u,int v,int f)
{
to[++tot]=v;
nxt[tot]=front[u];
front[u]=tot;
cap[tot]=f;
to[++tot]=u;
nxt[tot]=front[v];
front[v]=tot;
cap[tot]=0;
}
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
inline int id(int x,int y) { return (x-1)*m+y; }
inline void main()
{
n=read(),m=read();
s=n*m+1,t=s+1;
foir(i,1,n)
foir(j,1,m)
a[i][j]=read();
foir(i,1,n)
foir(j,1,m)
{
if (a[i][j]==1) link(s,id(i,j),inf);
else if (a[i][j]==2) link(id(i,j),t,inf);
foir(k,0,3)
{
int ni=i+dx[k],nj=j+dy[k];
if (ni<1||ni>n||nj<1||nj>m) continue;
if (a[i][j]==1)
link(id(i,j),id(ni,nj),1);
else if (a[i][j]!=2&&a[ni][nj]!=1)
link(id(i,j),id(ni,nj),1);
}
}
return void();
}
}
namespace Dinic
{
int lv[maxn],cur[maxn];
int q[maxn],l,r;
inline long long Min(long long a,long long b) { return a<b?a:b; }
int dfs(int u,long long maxf)
{
if (u==t) return maxf;
int res=0;
for (register int i=cur[u];i;i=nxt[i])
{
int v=to[i];
long long f=cap[i];
cur[u]=i;
if (lv[u]+1==lv[v]&&f)
{
f=dfs(v,Min(maxf-res,f));
cap[i]-=f;
cap[i^1]+=f;
res+=f;
if (res==maxf) return res;
}
}
if (!res) lv[u]=-1;
return res;
}
inline bool bfs()
{
memset(lv,0,sizeof lv);
l=r=1;
q[1]=s;
lv[s]=1;
cur[s]=front[s];
while (l<=r)
{
int u=q[l];
++l;
if (u==t) return 1;
for (register int i=front[u];i;i=nxt[i])
{
int v=to[i],f=cap[i];
if (!lv[v]&&f)
lv[v]=lv[u]+1,q[++r]=v,cur[v]=front[v];
}
}
return 0;
}
inline long long dinic()
{
long long res=0;
while (bfs())
res+=dfs(s,2147483647);
return res;
}
}using namespace Dinic;
int main()
{
prework::main();
cout<<dinic()<<endl;
return 0;
}