感觉没啥问题啊。。。
显然n,m没啥问题,黑白染色貌似没啥问题,建边貌似也没啥问题,Dinic貌似也没啥问题。。。。
自闭力
#include <bits/stdc++.h>
using namespace std;
const int maxn=10000+10,maxm=200000+10,maxt=100+10,Inf=0x3f3f3f3f;
int read(){
int w=0,x=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') x=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
w=(w<<1)+(w<<3)+(ch^48);
ch=getchar();
}
return x*w;
}
int n,m,s,t,tot,cnt=1,sum;
int cur[maxn],head[maxn],depth[maxn];
int f[maxt][maxt];
queue <int> q;
struct node{
int to,nxt,val;
}edge[maxm<<1];
void add(int from,int to,int val){
edge[++cnt].to=to;
edge[cnt].val=val;
edge[cnt].nxt=head[from];
head[from]=cnt;
}
bool bfs(){
memset(depth,0,sizeof(depth));
while(!q.empty()) q.pop();
depth[s]=1;
cur[s]=head[s];
q.push(s);
while(!q.empty()){
int u=q.front();
q.pop();
for(int i=cur[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(edge[i].val&&!depth[v]){
depth[v]=depth[u]+1;
cur[v]=head[v];
if(v==t) return 1;
q.push(v);
}
}
}
return 0;
}
int dfs(int u,int flow){
if(u==t) return flow;
int rest=flow,k;
for(int i=cur[u];i&&rest;i=edge[i].nxt){
cur[u]=i;
int v=edge[i].to;
if(edge[i].val&&depth[v]==depth[u]+1){
k=dfs(v,min(rest,edge[i].val));
if(!k) depth[v]=0;
edge[i].val-=k;
edge[i^1].val+=k;
rest-=k;
}
}
return flow-rest;
}
void Dinic(){
int flow=0;
int maxflow=0;
while(bfs()) while(flow=dfs(s,Inf)) maxflow+=flow;
printf("%d\n",sum-maxflow);
}
void Solve(){
n=read();
m=read();
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
f[i][j]=++tot;
}
}
s=++tot;
t=++tot;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
int x=read();
sum+=x;
if(((i+j)&1)==0){
add(s,f[i][j],x);
add(f[i][j],s,0);
}else{
add(f[i][j],t,x);
add(t,f[i][j],0);
}
}
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
if(f[i-1][j]){
add(f[i][j],f[i-1][j],Inf);
add(f[i-1][j],f[i][j],0);
}
if(f[i+1][j]){
add(f[i][j],f[i+1][j],Inf);
add(f[i+1][j],f[i][j],0);
}
if(f[i][j-1]){
add(f[i][j],f[i][j-1],Inf);
add(f[i][j-1],f[i][j],0);
}
if(f[i][j+1]){
add(f[i][j],f[i][j+1],Inf);
add(f[i][j+1],f[i][j],0);
}
}
}
Dinic();
}
int main(){
Solve();
return 0;
}