求调
查看原帖
求调
1313003
hwc2011楼主2025/7/19 08:57

样例没过,out155

#include<bits/stdc++.h>
#define int long long
#define inf (1e18)
using namespace std;
const int N=400005;
int n,m,s,t,x,head[N],to[N],w[N],nxt[N],cnt=2,dis[N],cur[N],ans,tot;
queue<int>q;
int doit(int x,int y){
	return (x-1)*m+y;
}
void add(int x,int y,int z){
	to[cnt]=y;
	w[cnt]=z;
	nxt[cnt]=head[x];
	head[x]=cnt++;
	to[cnt]=x;
	w[cnt]=0;
	nxt[cnt]=head[y];
	head[y]=cnt++;
}
bool bfs(){
	for(int i=s;i<=t;i++) dis[i]=inf;
	cur[s]=head[s];
	dis[s]=0;
	q.push(s);
	while(!q.empty()){
		int u=q.front();
		q.pop(); 
		for(int i=head[u];i;i=nxt[i]){
			int v=to[i];
			if(dis[v]<inf||!w[i]) continue;
			cur[v]=head[v];
			dis[v]=dis[u]+1;
			q.push(v);
		}
	}
	return dis[t]<inf;
}
int dfs(int u,int fl){
	if(u==t) return fl;
	int res=0;
	for(int i=cur[u];i;i=nxt[i]){
		cur[u]=i;
		int v=to[i];
		if(dis[v]!=dis[u]+1||!w[i]) continue;
		int f=dfs(v,min(fl,w[i]));
		if(!f) dis[v]=inf;
		res+=f;
		fl-=f;
		w[i]-=f;
		w[i^1]+=f;
		if(!fl) return res;
	} 
	return res;
}
signed main(){
	cin>>n>>m;
	t=3*n*m+1;
	tot=n*m;
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		cin>>x;
		ans+=x; 
		add(s,doit(i,j),x);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		cin>>x;
		ans+=x; 
		add(doit(i,j),t,x);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		cin>>x;
		ans+=x;
		add(s,++tot,x);
		add(tot,doit(i,j),inf);
		if(i+1<n) add(tot,doit(i+1,j),inf);
		if(i>1) add(tot,doit(i-1,j),inf);
		if(j+1<m) add(tot,doit(i,j+1),inf);
		if(j>1) add(tot,doit(i,j-1),inf);
	}
	for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
		cin>>x;
		ans+=x;
		add(++tot,t,x);
		add(doit(i,j),tot,inf);
		if(i+1<n) add(doit(i+1,j),tot,inf);
		if(i>1) add(doit(i-1,j),tot,inf);
		if(j+1<m) add(doit(i,j+1),tot,inf);
		if(j>1) add(doit(i,j-1),tot,inf);
	}
	while(bfs()) ans-=dfs(s,inf);
	cout<<ans;
}
2025/7/19 08:57
加载中...