#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#define min(a,b) (a)>(b)?(b):(a)
#define max(a,b) (a)>(b)?(a):(b)
#define inf 99999999
using namespace std;
int cnt;
int source,N;
int sink,ans;
int c[5000];
int H[500410];
int d[5041];
struct egde
{
int u,v,c,next;
};
egde a[500000];
void init()
{
int i;
for(i=0;i<500000;i++)
H[i]=-1;
cnt=0;
}
void add(int u,int v,int c)
{
//a[cnt].u=u;
a[cnt].v=v;
a[cnt].c=c;
a[cnt].next=H[u];
H[u]=cnt++;
}
void build(int u,int v,int c)
{
add(u,v,c);
add(v,u,0);
}
int dfs(int u,int flow)
{
if(u==sink)
return flow;
int Mindis = N;
int tt,res=0,delta;
for(tt=H[u];~tt;tt=a[tt].next)
{
int &v=a[tt].v,&c=a[tt].c;
if(c)
{
if(d[u]==d[v]+1)
{
delta=dfs(v,min(flow,c));
c-=delta;
a[tt^1].c+=delta;
res+=delta;
flow-=delta;
if(d[source]>=N) return res;
if(!flow)
break;
}
if(d[v]<Mindis)
Mindis=d[v];
}
}
if(!res)
{
if(!--c[d[u]]) d[source]=N;
d[u] = Mindis+1;
c[d[u]]++;
}
return res;
}
void sap()
{
memset(d,0,sizeof(d));
memset(c,0,sizeof(c));
c[0]=N;
while(d[source]<N)
ans+=dfs(source,inf);
}
int main()
{
int n,m,x,i,j;
int cases=1;
while(~scanf("%d%d",&n,&m))
{
ans=0;
source=0;
sink=n*m+1;
N=sink+1;
init();
for(i=1;i<=n;++i)
for(j=1;j<=m;++j)
{
scanf("%d",&x);
if(i>1) build((i-1)*m+j,(i-2)*m+j,1);
if(i<n) build((i-1)*m+j,i*m+j,1);
if(j>1) build((i-1)*m+j,(i-1)*m+j-1,1);
if(j<m) build((i-1)*m+j,(i-1)*m+j+1,1);
if(x==1)build((i-1)*m+j,sink,inf);
if(x==2)build(source,(i-1)*m+j,inf);
}
sap();
printf("Case %d:\n%d\n",cases++,ans);
}
return 0;
}
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #define min(a,b) (a)>(b)?(b):(a) #define max(a,b) (a)>(b)?(a):(b) #define inf 99999999 using namespace std; int cnt; int source,N; int sink,ans; int c[54400]; int H[520410]; int d[54410]; struct egde { int u,v,c,next; }; egde a[520000]; void init() { int i; for(i=0;i<520000;i++) H[i]=-1; cnt=0; } void add(int u,int v,int c) { a[cnt].v=v; a[cnt].c=c; a[cnt].next=H[u]; H[u]=cnt++; } void build(int u,int v,int c) { add(u,v,c); add(v,u,0); } int dfs(int u,int flow) { if(u==sink) return flow; int tt,res=0,delta; for(tt=H[u];~tt;tt=a[tt].next) { int &v=a[tt].v,&c=a[tt].c; if(c&&d[u]==d[v]+1){ delta=dfs(v,min(flow,c)); c-=delta; a[tt^1].c+=delta; res+=delta; flow-=delta; if (!flow) return res; } } if(!res) { if(!--c[d[u]]) d[source]=N+3; ++c[++d[u]]; } return res; } void sap() { memset(c,0,sizeof(c)); memset(d,0,sizeof(d)); c[source]=N; while(d[source]<N) ans+=dfs(source,inf); } int main() { int n,m,x,i,j; int cases=1; while(~scanf("%d%d",&n,&m)) { init(); ans=0; source = 0; sink=n*m+1; N=sink+1; for(i=1;i<=n;++i) for(j=1;j<=m;++j) { scanf("%d",&x); if(i>1)//上 build((i-1)*m+j,(i-2)*m+j,1); if(i<n)//下 build((i-1)*m+j,i*m+j,1); if(j>1)// left build((i-1)*m+j,(i-1)*m+j-1,1); if(j<m)// right build((i-1)*m+j,(i-1)*m+j+1,1); if(x==1) build((i-1)*m+j,sink,inf); else if(x==2) build(source,(i-1)*m+j,inf); } sap(); printf("Case %d:\n%d\n",cases++,ans); } return 0; }