样例不过,求调
查看原帖
样例不过,求调
530915
翟翟楼主2024/6/2 21:59
#include<bits/stdc++.h>
namespace IO{
	static const int buf_size=1000000;
	static unsigned char buf[buf_size];
	static int buf_len,buf_pos;
	bool isEOF(){
		if(buf_pos==buf_len){
			buf_pos=0;
			buf_len=fread(buf,1,buf_size,stdin);
			if(buf_pos==buf_len)return 1;
		}
		return 0;
	}
	char gc(){
		return isEOF()?EOF:buf[buf_pos++];
	}
	int rint(){
		int x=0;char c=gc();
		for(;c<48||c>57;c=gc());
		for(;c>=48&&c<=57;c=gc())
			x=(x<<1)+(x<<3)+(c^48);
		return x;
	}
	template<typename T>
	void read(T&x){x=rint();}
	template<typename T,typename...S>
	void read(T&x,S&...rest){read(x);read(rest...);}
}
using IO::read;
using namespace std;
const int N=1e4+1,M=2e5+1;
int n,m,s,t,a[101][101],dis[N],q[N*5],sum;
int tot=1,head[N],to[M],cap[M],nxt[M],cur[N];
bool vis[N];
void add(int u,int v,int w){
	nxt[++tot]=head[u];head[u]=tot;to[tot]=v;cap[tot]=w;
	nxt[++tot]=head[v];head[v]=tot;to[tot]=u;cap[tot]=0; 
}
bool bfs(){
	for(int i=1;i<=n;++i)dis[i]=-1,cur[i]=head[i];
	int l=0,r=1;
	q[1]=s;dis[s]=0;
	for(;l<r;){
		int x=q[++l];
		for(int i=head[x];i;i=nxt[i]){
			if(cap[i]&&dis[to[i]]==-1){
				dis[to[i]]=dis[x]+1;
				if(to[i]==t)return 1;
				q[++r]=to[i];
			}
		} 
	}
	return 0;
}
int dfs(int x,int f){
	if(x==t)return f;
	int used=0,d;
	for(int&i=cur[x];i;i=nxt[i])
		if(cap[i]&&dis[to[i]]==dis[x]+1){
			d=dfs(to[i],min(f,cap[i]));
			cap[i]-=d;cap[i^1]+=d;
			used+=d;f-=d;
			if(!f)return used;
		}
	if(!used)dis[x]=-1;
	return used;
} 
int dinic(){
	int res=0;
	for(;bfs();)res+=dfs(s,2e9);
	return res;
}
int main(){
	read(n,m);
	s=n*m+1;t=s+1;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			read(a[i][j]);
			sum+=a[i][j];
			if((i+j)&1){
				add(s,m*(i-1)+j,a[i][j]);
				if(i>1)add(m*(i-1)+j,m*(i-2)+j,2e9);
				if(j>1)add(m*(i-1)+j,m*(i-1)+j-1,2e9);
				if(i<n)add(m*(i-1)+j,m*i+j,2e9);
				if(j<m)add(m*(i-1)+j,m*(i-1)+j+1,2e9);
			}
			else{
				add(m*(i-1)+j,t,a[i][j]);
			}
		}
	}
	printf("%d\n",sum-dinic());
	return 0;
}
2024/6/2 21:59
加载中...