洛谷 P1646 [国家集训队]happiness / YbtOJ「图论」第3章 网络流模型及应用 C. 【例题3】幸福值 题解--zhengjun

思路

很显然直接用最小割处理这种问题(列个方程解一下,注意两点中间的边要用正权,其他的边的权值可以任意变换)。

发现现在的问题是求最大的方案,于是我们把边权取相反数,就转化为最小割问题了。

然而现在有一个问题,就是边权是负数,不能跑最小割,所以把其他的边权加上一个值变成正数,最后减掉去,就可以了。

代码

#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N=1e2+10,V=N*N,E=V*24;const ll inf=1e18;
int n,m,s,t,a[2][N][N],head[V],kk=1,d[V],cur[V];struct edges{int to;ll c;int nex;}edge[E];ll ans;
int id(int i,int j){return (i-1)*m+j;}
void add(int u,int v,int c1,int c2=0){edge[++kk]={v,c1,head[u]};head[u]=kk;edge[++kk]={u,c2,head[v]};head[v]=kk;}
bool bfs(){
	queue<int>q;q.push(s);memset(d,-1,sizeof d);cur[s]=head[s];d[s]=0;for(int u;!q.empty();q.pop()){
		u=q.front();for(int i=head[u],v;v=edge[i].to,i;i=edge[i].nex)
			if(!~d[v]&&edge[i].c)d[v]=d[u]+1,q.push(v),cur[v]=head[v];
	}return ~d[t];
}
ll dfs(int u,ll lim=inf){
	if(u==t)return lim;ll flow=0;for(int i=cur[u],v;v=edge[i].to,i&&flow<lim;i=edge[i].nex){
		cur[u]=i;if(d[v]!=d[u]+1||!edge[i].c)continue;int f=dfs(v,min(lim-flow,edge[i].c));
		if(!f)d[v]=-1;edge[i].c-=f;edge[i^1].c+=f;flow+=f;
	}return flow;
}
ll dinic(){ll maxflow=0;while(bfs())maxflow+=dfs(s);return maxflow;}
int main(){
	cin>>n>>m;s=0;t=n*m+1;for(int k=0,x;k<2;k++)for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){
		cin>>x;ans+=x;if(k&1)add(s,id(i,j),x);else add(id(i,j),t,x);
	}for(int k=0;k<2;k++)for(int i=1;i<n;i++)for(int j=1;j<=m;j++)cin>>a[k][i][j],ans+=a[k][i][j]<<1;
	for(int i=1;i<n;i++)for(int j=1;j<=m;j++){
		add(id(i,j),id(i+1,j),a[1][i][j],a[0][i][j]);add(s,id(i,j),a[1][i][j]);add(id(i,j),t,a[0][i][j]);
		add(s,id(i+1,j),a[0][i][j]+a[1][i][j]);add(id(i+1,j),t,a[0][i][j]+a[1][i][j]);
	}for(int k=0;k<2;k++)for(int i=1;i<=n;i++)for(int j=1;j<m;j++)cin>>a[k][i][j],ans+=a[k][i][j]<<1;
	for(int i=1;i<=n;i++)for(int j=1;j<m;j++){
		add(id(i,j),id(i,j+1),a[1][i][j],a[0][i][j]);add(s,id(i,j),a[1][i][j]);add(id(i,j),t,a[0][i][j]);
		add(s,id(i,j+1),a[0][i][j]+a[1][i][j]);add(id(i,j+1),t,a[0][i][j]+a[1][i][j]);
	}cout<<ans-dinic();return 0;
}
posted @ 2022-07-04 19:20  A_zjzj  阅读(26)  评论(0编辑  收藏  举报