记录编号 431555 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 [国家集训队2011]happiness(吴确) 最终得分 100
用户昵称 GravatarBaDBoY 是否通过 通过
代码语言 C++ 运行时间 0.467 s
提交时间 2017-08-01 06:32:18 内存使用 22.24 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define inf 100000007
#define int long long
int read() {
	int s=0,f=1;
	char ch=getchar();
	while(ch>'9'||ch<'0') {
		if(ch=='-') {
			f=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		s=(s<<1)+(s<<3)+(ch^48);
		ch=getchar();
	}
	return s*f;
}
int n,m,sum;
int wen_sin[101][101],li_sin[101][101],wen_xia[101][101],li_xia[101][101],wen_you[101][101],li_you[101][101];
int dis[102][102],num[101][101],zong,tot,S,T,r[10005];
int sum_li[10002],sum_wen[10002];
struct oo {
	int to,vv,next;
} c[1000005];
void add(int x,int y,int z) {
	c[tot].to=y;
	c[tot].vv=z;
	c[tot].next=r[x];
	r[x]=tot++;
}
void init() {
	memset(r,-1,sizeof(r));
	n=read();
	m=read();
	T=n*m+1;
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			num[i][j]=++zong;
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			wen_sin[i][j]=read()*2;
			sum+=wen_sin[i][j];
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			li_sin[i][j]=read()*2;
			sum+=li_sin[i][j];
		}
	}
	for(int i=1; i<n; i++) {
		for(int j=1; j<=n; j++) {
			wen_xia[i][j]=read()*2;
			sum_wen[num[i][j]]+=wen_xia[i][j];
			sum_wen[num[i+1][j]]+=wen_xia[i][j];
			sum+=wen_xia[i][j];
		}
	}
	for(int i=1; i<n; i++) {
		for(int j=1; j<=m; j++) {
			li_xia[i][j]=read()*2;
			sum_li[num[i][j]]+=li_xia[i][j];
			sum_li[num[i+1][j]]+=li_xia[i][j];
			sum+=li_xia[i][j];
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<m; j++) {
			wen_you[i][j]=read()*2;
			sum_wen[num[i][j]]+=wen_you[i][j];
			sum_wen[num[i][j+1]]+=wen_you[i][j];
			sum+=wen_you[i][j];
		}
	}
	for(int i=1; i<=n; i++) {
		for(int j=1; j<m; j++) {
			li_you[i][j]=read()*2;
			sum_li[num[i][j]]+=li_you[i][j];
			sum_li[num[i][j+1]]+=li_you[i][j];
			sum+=li_you[i][j];
		}
	}
}
// S li T wen
void build() {
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			int x=li_sin[i][j]+sum_li[num[i][j]]/2;
			add(S,num[i][j],x);
			add(num[i][j],S,0);
			int y=wen_sin[i][j]+sum_wen[num[i][j]]/2;
			add(num[i][j],T,y);
			add(T,num[i][j],0);
			if(i<n) {
				add(num[i][j],num[i+1][j],(li_xia[i][j]+wen_xia[i][j])/2);
				add(num[i+1][j],num[i][j],0);
				add(num[i+1][j],num[i][j],(li_xia[i][j]+wen_xia[i][j])/2);
				add(num[i][j],num[i+1][j],0);
			}
			if(j<m) {
				add(num[i][j],num[i][j+1],(li_you[i][j]+wen_you[i][j])/2);
				add(num[i][j+1],num[i][j],0);
				add(num[i][j+1],num[i][j],(li_you[i][j]+wen_you[i][j])/2);
				add(num[i][j],num[i][j+1],0);
			}
		}
	}
}
int queue[1000005],head,tail,deep[10005];
bool vis[10005];
bool bfs(int s,int t) {
	memset(deep,0,sizeof(deep));
	memset(vis,0,sizeof(vis));
	head=tail=0;
	deep[s]=1;
	vis[s]=1;
	queue[++tail]=s;
	while(head<tail) {
		int opt=queue[++head];
		vis[opt]=0;
		for(int i=r[opt]; ~i; i=c[i].next) {
			if(c[i].vv&&!deep[c[i].to]) {
				deep[c[i].to]=deep[opt]+1;
				if(!vis[c[i].to]){
					queue[++tail]=c[i].to;
					vis[c[i].to]=1;
				}
				if(c[i].to==t) {
					return 1;
				}
			}
		}
	}
	return 0;
}
int dfs(int opt,int fw) {
	if(opt==T) {
		return fw;
	}
	int tmp=fw,k;
	for(int i=r[opt]; ~i; i=c[i].next) {
		if(tmp&&c[i].vv&&deep[c[i].to]==deep[opt]+1) {
			k=dfs(c[i].to,min(c[i].vv,tmp));
			if(!k) {
				deep[c[i].to]=0;
				continue;
			}
			c[i].vv-=k;
			c[i^1].vv+=k;
			tmp-=k;
		}
	}
	return fw-tmp;
}
int dinic(int s,int t) {
	int ans=0;
	while(bfs(s,t)) {
		ans+=dfs(s,inf);
	}
	return ans;
}
int Main(){
	freopen("nt2011_happiness.in","r",stdin);
	freopen("nt2011_happiness.out","w",stdout);
	init();
	build();
	int ans=dinic(S,T);
	printf("%d\n",(sum-ans)>>1);
	return 0;
}
int hehe=Main();
signed main() {
	;
}