已经非常贴近题解了,40pts求条,玄关
查看原帖
已经非常贴近题解了,40pts求条,玄关
439609
封禁用户楼主2024/7/17 22:56
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e6+5;
int n,m,x,y,dis[N],now[N],inf=1e18,ans,head[N],tot=1,s,t,sum,zh;
int dw[N],cz[N],a;
int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
struct Edge
{
	int v,next,val;
}e[N];
int bh(int i,int j)
{
	return (i-1)*m+j;
}
void add(int x,int y,int z)
{
	e[++tot].v=y;
	e[tot].next=head[x];
	head[x]=tot;
	e[tot].val=z;
}
bool bfs()
{
	for(int i=s;i<=t;i++) dis[i]=inf;
	queue<int> q;
	q.push(s);
	dis[s]=0;
	now[s]=head[s];
	while(!q.empty())
	{
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=e[i].next)
		{
			int to=e[i].v;
			if(e[i].val>0&&dis[to]==inf)
			{
				q.push(to);
				now[to]=head[to];
				dis[to]=dis[x]+1;
				if(to==t) return true;
			}
		}
	}
	return false;
}
int dfs(int x,int sum)
{
	int k,res=0;
	if(x==t) return sum;
	for(int i=now[x];i&&sum;i=e[i].next)
	{
		now[x]=i;
		int to=e[i].v;
		if(e[i].val>0&&dis[to]==dis[x]+1)
		{
			k=dfs(to,min(sum,e[i].val));
			if(k==0) dis[to]=inf;
			e[i].val-=k;
			e[i^1].val+=k;
			res+=k;
			sum-=k;
		}
	}
	return res;
}
signed main()
{
	scanf("%lld%lld",&m,&n);
	s=0,t=n*m+1;
	for(int i=1;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			scanf("%lld",&a);
			zh+=a;
			if((i+j)%2==0)
			{
				add(s,bh(i,j),a);
				add(bh(i,j),s,0);
				for(int k=0;k<=3;k++)
				{
					int rx=i+dx[k],ry=j+dy[k];
					if(rx>=1&&rx<=m&&ry>=1&&ry<=n)
					{
						add(bh(i,j),bh(rx,ry),inf);
						add(bh(rx,ry),bh(i,j),0);
					}
				}
			}
			else
			{
				add(bh(i,j),t,a);
				add(t,bh(i,j),0);
			}
		}
	}
	while(bfs()) ans+=dfs(s,inf);
	printf("%lld",zh-ans);
	return 0;
}
2024/7/17 22:56
加载中...