WA18pts 求助/kk
查看原帖
WA18pts 求助/kk
203008
山田リョウ楼主2022/6/8 22:58
// Problem: P2774 方格取数问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2774
// Memory Limit: 125 MB
// Time Limit: 1000 ms

#include<stdio.h>
namespace maximum_flow{
	const int maxv=10002,maxe=100000;
	int n,s,t,tot,head[maxv],cur[maxv],dis[maxv];
	struct{int v,c,nxt;}e[maxe];
	inline void init(){
		for(int i=0;i<=n;++i)head[i]=-1;
	}
	inline void addedge(int u,int v,int c){
		e[tot]={v,c,head[u]},head[u]=tot++;
		e[tot]={u,0,head[v]},head[v]=tot++;
	}
	bool bfs(){
		static int q[maxv];
		int l=0,r=0;
		for(int i=0;i<=n;++i)cur[i]=head[i],dis[i]=-1;
		for(q[r++]=s,dis[s]=0;l<r;++l)
			for(int j=head[q[l]];~j;j=e[j].nxt)
				if(e[j].c&&dis[e[j].v]==-1)
					dis[e[j].v]=dis[q[l]]+1,q[r++]=e[j].v;
		return ~dis[t];
	}
	int dfs(int u,int lim=0x7fffffff){
		if(u==t)return lim;
		int res=0,flow;
		for(int&i=cur[u];~i;i=e[i].nxt)
			if(e[i].c&&dis[e[i].v]==dis[u]+1&&(flow=dfs(e[i].v,e[i].c>lim?lim:e[i].c))){
				e[i].c-=flow,e[i^1].c+=flow;
				if(!(res+=flow,lim-=flow))break;
			}
		if(!res)dis[u]=-1;
		return res;
	}
	int dinic(){
		int res=0;
		for(;bfs();res+=dfs(s));
		return res;
	}
}
int main(){
	int n,m,x,res=0;
	scanf("%d%d",&n,&m);
	maximum_flow::n=n*m+2,maximum_flow::s=0,maximum_flow::t=n*m+1,maximum_flow::init();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j){
			scanf("%d",&x),res+=x;
			if(i+j&1)maximum_flow::addedge((i-1)*n+j,maximum_flow::t,x);
			else maximum_flow::addedge(maximum_flow::s,(i-1)*n+j,x);
		}
	for(int i=1;i<=n;++i)
		for(int j=1;j<m;++j)
			if(i+j&1)
				maximum_flow::addedge((i-1)*n+j+1,(i-1)*n+j,0x7fffffff);
			else
				maximum_flow::addedge((i-1)*n+j,(i-1)*n+j+1,0x7fffffff);
	for(int i=1;i<n;++i)
		for(int j=1;j<=m;++j)
			if(i+j&1)
				maximum_flow::addedge(i*n+j,(i-1)*n+j,0x7fffffff);
			else
				maximum_flow::addedge((i-1)*n+j,i*n+j,0x7fffffff);
	printf("%d\n",res-=maximum_flow::dinic());
	return 0;
}

调了一晚上了,调不出来了

2022/6/8 22:58
加载中...