记录编号 |
571715 |
评测结果 |
AAAAAAAAAAA |
题目名称 |
[网络流24题] 方格取数问题 |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.008 s |
提交时间 |
2022-06-15 21:11:12 |
内存使用 |
0.54 MiB |
显示代码纯文本
#include<bits/stdc++.h>
#define maxn 1010
#define maxm 4000010
#define inf 2147483647
using namespace std;
vector<int>b[maxn],c[maxn],to[maxn];
void add(int x,int y,int c1){
b[x].push_back(y);b[y].push_back(x);
c[x].push_back(c1);c[y].push_back(0);
to[x].push_back(b[y].size()-1);to[y].push_back(b[x].size()-1);
return;
}
int s,t,d[maxn],l,r,dis[maxn];
int bfs(){
for(int i=1;i<=t;i++)dis[i]=-1;
l=r=0;d[++r]=s;dis[s]=0;
while(l!=r){int u=d[++l];
for(int i=0;i<b[u].size();i++){
int v=b[u][i],c1=c[u][i];
if(dis[v]==-1&&c1>0)
dis[v]=dis[u]+1,d[++r]=v;
}
}
return (dis[t]==-1)?0:1;
}
int dfs(int p,int a){
if(p==t)return a;
int fl=0,f;
for(int i=0;i<b[p].size();i++){
int v=b[p][i],c1=c[p][i];
if(c1<=0)continue;
if(dis[v]==dis[p]+1&&(f=dfs(v,min(a,c1)))>0)
fl+=f,a-=f,c[p][i]-=f,c[v][to[p][i]]+=f;
if(a==0)break;
}
if(a==0)dis[p]=-1;
return fl;
}
int dinic(){
int ans=0;
while(bfs())ans+=dfs(s,inf);
return ans;
}
int n,m,a1,ans;
int main(){
freopen("grid.in","r",stdin);
freopen("grid.out","w",stdout);
scanf("%d%d",&n,&m);
s=n*m+1,t=n*m+2;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
scanf("%d",&a1);ans+=a1;
if((i+j)%2==0){
add(s,m*(i-1)+j,a1);
if(i!=1)add(m*(i-1)+j,m*(i-2)+j,inf);
if(i!=n)add(m*(i-1)+j,m*i+j,inf);
if(j!=1)add(m*(i-1)+j,m*(i-1)+j-1,inf);
if(j!=m)add(m*(i-1)+j,m*(i-1)+j+1,inf);
}
else add(m*(i-1)+j,t,a1);
}
}
printf("%d\n",ans-dinic());
return 0;
}