本地跑样例是对的,交上去后就不对了
代码:
#include<bits/stdc++.h>
using namespace std;
const int Inf=1e9;
int n,m;
int a[105][105];
struct Edge{
int to,nxt,w;
}e[500005];
int head[10005],h[10005],tot=1,S,T;
int dis[10005];
inline void add(int u,int v,int W){
e[++tot]=(Edge){v,head[u],W};
head[u]=tot;
e[++tot]=(Edge){u,head[v],0};
head[v]=tot;
}
inline int num(int X,int Y){return (X-1)*m+Y;}
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
bool bfs(){
memset(dis,0,sizeof dis);
queue<int>q;
q.push(S);
dis[S]=1;
h[S]=head[S];
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].nxt){
int y=e[i].to;
if(!dis[y]&&e[i].w){
dis[y]=dis[x]+1;
h[y]=head[y];
q.push(y);
if(y==T)return 1;
}
}
}
return 0;
}
int dfs(int x,int sum){
if(x==T)return sum;
int res=sum;
for(int i=h[x];i&∑i=e[i].nxt){
int y=e[i].to;
h[x]=i;
if((dis[y]==dis[x]+1)&&e[i].w){
int tmp=dfs(y,min(sum,e[i].w));
if(!tmp)dis[y]=0;
sum-=tmp;
e[i].w-=tmp;
e[i^1].w+=tmp;
}
}
return res-sum;
}
int Dinic(){
int ans=0;
while(bfs())ans+=dfs(S,Inf);
return ans;
}
signed main(){
cin>>n>>m;
int sum=0;
S=0,T=n*m+1;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
sum+=a[i][j];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if((i+j)&1)add(num(i,j),T,a[i][j]);
else{
add(S,num(i,j),a[i][j]);
for(int l=0;l<4;l++){
int X=i+xx[l];
int Y=j+yy[l];
if(X<0||X>n||Y<0||Y>m)continue;
add(num(i,j),num(X,Y),Inf);
}
}
}
}
cout<<sum-Dinic();
return 0;
}