BZOJ 3894 文理分科
题解:最小割建模
如果某些元素在一起会得到收益考虑最小割
答案 总收益-最小割
注意:对0点的处理
一开始模型是错的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#include<queue>
#include<cassert>
#include<algorithm>
using namespace std;
const int maxn=100000;
const int oo=1000000000;int n,m;
int ans=0;
int totn=0;
int p[200][200];struct Edge{int from,to,cap,flow;Edge(){from=to=cap=flow=0;}
};
vector<int>G[maxn];
vector<Edge>edges;
void Addedge(int x,int y,int z){if((x==0)||(y==0))return; Edge e;e.from=x;e.to=y;e.cap=z;e.flow=0;edges.push_back(e);e.from=y;e.to=x;e.cap=0;e.flow=0;edges.push_back(e);int c=edges.size();G[x].push_back(c-2);G[y].push_back(c-1);
}int s,t;
queue<int>q;
int vis[maxn];
int d[maxn];
int Bfs(){memset(vis,0,sizeof(vis));vis[s]=1;d[s]=0;q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=0;i<G[x].size();++i){Edge e=edges[G[x][i]];if((!vis[e.to])&&(e.cap>e.flow)){vis[e.to]=1;d[e.to]=d[x]+1;q.push(e.to);}}}return vis[t];
}int Dfs(int x,int a){if((x==t)||(a==0))return a;int nowflow=0,f=0;for(int i=0;i<G[x].size();++i){Edge e=edges[G[x][i]];if((d[e.to]==d[x]+1)&&((f=Dfs(e.to,min(a,e.cap-e.flow)))>0)){nowflow+=f;a-=f;edges[G[x][i]].flow+=f;edges[G[x][i]^1].flow-=f;if(a==0)break;}}return nowflow;
}int Maxflow(){int flow=0;while(Bfs())flow+=Dfs(s,oo);return flow;
}//s->Ñ¡ÎÄ
//t->Ñ¡Àí
//hashmapÅжϱßÊÇ·ñ´æÔÚ
int main(){scanf("%d%d",&n,&m);s=n*m+1;t=n*m+2;totn=t;for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){p[i][j]=(i-1)*m+j;}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){int x;scanf("%d",&x);ans+=x;Addedge(s,p[i][j],x);}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){int x;scanf("%d",&x);ans+=x;Addedge(p[i][j],t,x);}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){int x;scanf("%d",&x);ans+=x;++totn;Addedge(s,totn,x);Addedge(totn,p[i][j],oo);Addedge(totn,p[i][j-1],oo);Addedge(totn,p[i][j+1],oo);Addedge(totn,p[i-1][j],oo);Addedge(totn,p[i+1][j],oo);}}for(int i=1;i<=n;++i){for(int j=1;j<=m;++j){int x;scanf("%d",&x);ans+=x;++totn;Addedge(totn,t,x);Addedge(p[i][j],totn,oo);Addedge(p[i][j-1],totn,oo);Addedge(p[i][j+1],totn,oo);Addedge(p[i-1][j],totn,oo);Addedge(p[i+1][j],totn,oo);}}printf("%d\n",ans-Maxflow());return 0;
}
转载于:https://www.cnblogs.com/zzyer/p/8485854.html
BZOJ 3894 文理分科相关推荐
- [BZOJ 3894]文理分科
3438: 小M的作物 Time Limit: 10 Sec Memory Limit: 256 MB Submit: 729 Solved: 328 [Submit][Status][Discu ...
- [BZOJ 3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同 ...
- bzoj 3894: 文理分科 最小割
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
- bzoj 3894: 文理分科
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位 ...
- BZOJ 3894 文理分科 最小割
题目大意:给定一个m*n的矩阵,每个格子的人可以学文或者学理,学文和学理各有一个满意度,如果以某人为中心的十字内所有人都学文或者学理还会得到一个额外满意度,求最大满意度之和 令S集为学文,T集为学理 ...
- BZOJ:3894: 文理分科(网络流)
题目 每个同学都只能选择文科或者理科一种,选择文科会获得一个权值,理科也有,如果一个人以及周围四个人都选择了一个学科,那么又会获得一个权值. 将权值最大化. 分析 很经典的网络流题目,用最小割. 首先 ...
- 【BZOJ 3894】 文理分科
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 194 Solved: 122 [Submit][Status][Discuss] ...
- BZOJ3894:文理分科——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=3894 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理 ...
- 文理分科 (最小割问题)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位同学 ...
最新文章
- Libgcrypt实现AES加密
- 小学生学python-小学生就学编程,就学Python,真的那么重要吗?
- 第九章:路由网关(Zuul)的使用
- ITK:计算两个3D点之间的距离
- mongodb性能分析方法:explain()
- 网页设计师应向肖像画家吸取的11个理念
- Python嵌套定义函数增强reduce()函数功能
- 【2018.1.14】关于本蒟蒻
- 灰度直方图匹配(灰度直方图规定化)matlab代码
- 最优化算法 之 遗传算法代码实现及说明
- 伺服驱动器的接线与基本控制
- SpringCloud-Alibaba之Nacos,Java集合面试题及答案
- SeaweedFS安装部署
- 基于WKT标准的空间参考系字符串及prj文件生成样例
- int i=-20; unsigned int j = 10; i+j;的问题
- 道闸系统 无法连接消息服务器,道闸系统常见故障处理
- 基于微信小程序的驾校报名管理系统
- 视频号匹配时事热点创作内容效果更好
- 如何复制word中带修订标记的段落
- 华为手机p40pro计算机不管,华为p40pro支持PC模式吗