ek算法效率太低,在这会超时,
用dinic算法,还不错。。
#include"stdio.h"
#include"string.h"
#define inf 0x7fffffff
#define M 20000
int n,m,s,t,adj[M],dis[M];
int q[M],p[M],sum;
struct point
{
int v,u;
int flow,next;
}map[M];
int min(int a,int b)
{
a=a>b?b:a;
return a;
}
void insert(int u,int v,int w)
{
map[sum].u=u,map[sum].v=v,map[sum].flow=w,map[sum].next=adj[u];
adj[u]=sum;sum++;
map[sum].u=v,map[sum].v=u,map[sum].flow=0,map[sum].next=adj[v];
adj[v]=sum;sum++;
}
int bfs()
{
int i,x,v,tail=0,head=0;
memset(dis,0,sizeof(dis));
dis[s]=1;
q[tail++]=s;
while(head<tail)
{
x=q[head++];
for(i=adj[x];i!=-1;i=map[i].next)
{
v=map[i].v;
if(map[i].flow&&dis[v]==0)
{
dis[v]=dis[x]+1;
if(v==t)
return 1;
q[tail++]=v;
}
}
}
return 0;
}
int dfs(int s,int limit)
{
if(s==t)
return limit;
int i,temp,cost=0,v;
for(i=adj[s];i!=-1;i=map[i].next)
{
v=map[i].v;
if(map[i].flow&&dis[s]==dis[v]-1)
{
temp=dfs(v,min(limit-cost,map[i].flow));
if(temp>0)
{
map[i].flow-=temp;
map[i^1].flow+=temp;
cost+=temp;
if(limit==cost)
break;
}
else
dis[v]=-1;
}
}
return cost;
}
int dinic()
{
int ans=0;
while(bfs())
{
ans+=dfs(s,inf);
}
return ans;
}
int main()
{
int i,k,ss;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(adj,-1,sizeof(adj));
memset(p,0,sizeof(p));
s=0,sum=0;t=n*m+1;ss=0;
for(i=1;i<=n*m;i++)
{
scanf("%d",&k);
ss+=k;
if(i>m)
p[i]=(p[i-m]+1)%2;
else
p[i]=(p[i-1]+1)%2;
if(p[i]==1)
{
insert(0,i,k);
if(i%m!=1)
insert(i,i-1,inf);
if(i%m!=0)
insert(i,i+1,inf);
if(i>m)
insert(i,i-m,inf);
if(i<=m*(n-1))
insert(i,i+m,inf);
}
else
insert(i,t,k);
}
printf("%d\n",ss-dinic());
}
return 0;
}