萌新只有36分,help!
查看原帖
萌新只有36分,help!
335191
式呀式呀式呀楼主2020/11/17 07:31

感觉没啥问题啊。。。

显然n,m没啥问题,黑白染色貌似没啥问题,建边貌似也没啥问题,Dinic貌似也没啥问题。。。。

自闭力

#include <bits/stdc++.h>
using namespace std;
const int maxn=10000+10,maxm=200000+10,maxt=100+10,Inf=0x3f3f3f3f;
int read(){
	int w=0,x=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') x=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		w=(w<<1)+(w<<3)+(ch^48);
		ch=getchar();
	}
	return x*w;
}
int n,m,s,t,tot,cnt=1,sum;
int cur[maxn],head[maxn],depth[maxn];
int f[maxt][maxt];
queue <int> q;
struct node{
	int to,nxt,val;
}edge[maxm<<1];
void add(int from,int to,int val){
	edge[++cnt].to=to;
	edge[cnt].val=val;
	edge[cnt].nxt=head[from];
	head[from]=cnt;
}
bool bfs(){
	memset(depth,0,sizeof(depth));
	while(!q.empty()) q.pop();
	depth[s]=1;
	cur[s]=head[s];
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop();
		for(int i=cur[u];i;i=edge[i].nxt){
			int v=edge[i].to;
			if(edge[i].val&&!depth[v]){
				depth[v]=depth[u]+1;
				cur[v]=head[v];
				if(v==t) return 1;
				q.push(v);
			}
		}
	}
	return 0;
}
int dfs(int u,int flow){
	if(u==t) return flow;
	int rest=flow,k;
	for(int i=cur[u];i&&rest;i=edge[i].nxt){
		cur[u]=i;
		int v=edge[i].to;
		if(edge[i].val&&depth[v]==depth[u]+1){
			k=dfs(v,min(rest,edge[i].val));
			if(!k) depth[v]=0;
			edge[i].val-=k;
			edge[i^1].val+=k;
			rest-=k;
		}
	}
	return flow-rest;
}
void Dinic(){
	int flow=0;
	int maxflow=0;
	while(bfs()) while(flow=dfs(s,Inf)) maxflow+=flow;
	printf("%d\n",sum-maxflow);
}
void Solve(){
	n=read();
	m=read();
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			f[i][j]=++tot;
		}
	}
	s=++tot;
	t=++tot;
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			int x=read();
			sum+=x;
			if(((i+j)&1)==0){
				add(s,f[i][j],x);
				add(f[i][j],s,0);
			}else{
				add(f[i][j],t,x);
				add(t,f[i][j],0);
			}
		}
	}
	for(int i=1;i<=n;++i){
		for(int j=1;j<=m;++j){
			if(f[i-1][j]){
				add(f[i][j],f[i-1][j],Inf);
				add(f[i-1][j],f[i][j],0);
			}
			if(f[i+1][j]){
				add(f[i][j],f[i+1][j],Inf);
				add(f[i+1][j],f[i][j],0);
			}
			if(f[i][j-1]){
				add(f[i][j],f[i][j-1],Inf);
				add(f[i][j-1],f[i][j],0);
			}
			if(f[i][j+1]){
				add(f[i][j],f[i][j+1],Inf);
				add(f[i][j+1],f[i][j],0);
			}
		}
	}
	Dinic();
}
int main(){
	Solve();
	return 0;
}
2020/11/17 07:31
加载中...