mnzn求调
查看原帖
mnzn求调
803851
hualuo_2楼主2024/7/13 20:25

最后一个点内存240多,是wa

#include<bits/stdc++.h>
#define ll long long
using namespace std;

constexpr ll MN=1e6+5;
constexpr ll inf=0x3f3f3f3f;

ll read()
{
	int f=1,x=0;int ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

ll head[MN],ver[MN*6],edge[MN*6],net[MN*6],d[MN],now[MN];
ll n,m,ss,tt,tot,maxflow;
queue<int> q; 

void add(int x,int y,int z)
{
	ver[++tot]=y,edge[tot]=z,net[tot]=head[x],head[x]=tot;
	ver[++tot]=x,edge[tot]=0,net[tot]=head[y],head[y]=tot;
}

bool bfs()
{
	memset(d,0,sizeof(d));
	while(q.size()) q.pop();
	q.push(ss);d[ss]=1;now[ss]=head[ss];
	while(q.size())
	{
		ll x=q.front();
		q.pop();
		for(ll i=head[x];i;i=net[i])
			if(edge[i]&&!d[ver[i]])
			{
				q.push(ver[i]);
				now[ver[i]]=head[ver[i]];
				d[ver[i]]=d[x]+1;
				if(ver[i]==tt) return 1;
			}
	}
	return 0;
}

int dinic(int x,int flow)
{
	if(x==tt) return flow;
	ll rest=flow,k,i;
	for(i=now[x];i&&rest;i=net[i])
	{
		now[x]=i;
		if(edge[i]&&d[ver[i]]==d[x]+1)
		{
			k=dinic(ver[i],min(rest,edge[i]));
			if(!k) d[ver[i]]=0;
			edge[i]-=k;
			edge[i^1]+=k;
			rest-=k;
		}
	}
	return flow-rest;
}

int main()
{
//	freopen("未命名2.in","r",stdin);
//	freopen("未命名2.out","w",stdout);
	n=read();m=read();
//	s=read();t=read();
    ss=1;tt=n*m;
	tot=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m-1;j++)
		{
			ll val;
			val=read();
			add((i-1)*m+j,(i-1)*m+j+1,val);
			add((i-1)*m+j+1,(i-1)*m+j,val);
		}
	}
	for(int i=1;i<=n-1;i++)
	{
		for(int j=1;j<=m;j++)
		{
			ll val;
			val=read();
			add((i-1)*m+j,i*m+j,val);
			add(i*m+j,(i-1)*m+j,val);
		}
	}
	for(int i=1;i<=n-1;i++)
	{
		for(int j=1;j<=m-1;j++)
		{
			ll val;
			val=read();
			add((i-1)*m+j,i*m+j+1,val);
			add(i*m+j+1,(i-1)*m+j,val);
		}
	}
	ll flow=0;
	while(bfs() )
	{
		while((flow=dinic(ss,inf))) maxflow+=flow;
	}
	printf("%lld",maxflow);
	return 0;
}
2024/7/13 20:25
加载中...