Bzoj3894 文理分科
Time Limit: 10 Sec Memory Limit: 512 MB
Submit: 667 Solved: 389
Description
Input
Output
Sample Input
13 2 4 13
7 13 8 12
18 17 0 5
8 13 15 4
11 3 8 11
11 18 6 5
1 2 3 4
4 2 3 2
3 1 0 4
3 2 3 2
0 2 2 1
0 2 4 4
Sample Output
HINT
网络流 最小割
最大权闭合子图
1、从S向学生连边,容量为学文的收益;
2、从学生向T连边,容量为学理的收益;
3、对于一个学生,新建一个点,从S向该点连边,容量为周围人都学文的收益,再从该点向周围学生连边,容量为INF;
4、都学理同理。
答案为权值总和减去最小割
思路倒是好想,然而各种写不对,最后发现,处理一群人学同样课的点的时候,没有向表示该学生自身的点连边……
- /*by SilverN*/
- #include<algorithm>
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- #include<cmath>
- #include<vector>
- #include<queue>
- using namespace std;
- const int mx[]={,,,-,};
- const int my[]={,,,,-};
- const int INF=1e9;
- const int mxn=;
- int read(){
- int x=,f=;char ch=getchar();
- while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
- while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
- return x*f;
- }
- struct edge{
- int v,nxt,f;
- }e[mxn*];
- int hd[mxn],mct=;
- void add_edge(int u,int v,int f){
- e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=f;hd[u]=mct;return;
- }
- void insert(int u,int v,int f){
- add_edge(u,v,f);
- add_edge(v,u,);
- return;
- }
- int n,m,S,T;
- int d[mxn];
- bool BFS(){
- memset(d,,sizeof d);
- queue<int>q;
- d[S]=;
- q.push(S);
- while(!q.empty()){
- int u=q.front();q.pop();
- for(int i=hd[u];i;i=e[i].nxt){
- int v=e[i].v;
- if(e[i].f && !d[v]){
- d[v]=d[u]+;
- q.push(v);
- }
- }
- }
- return d[T];
- }
- int DFS(int u,int lim){
- if(u==T)return lim;
- int f=,tmp;
- for(int i=hd[u];i;i=e[i].nxt){
- int v=e[i].v;
- if(d[v]==d[u]+ && e[i].f){
- tmp=DFS(v,min(lim,e[i].f));
- e[i].f-=tmp;
- e[i^].f+=tmp;
- f+=tmp;
- lim-=tmp;
- if(!lim)return f;
- }
- }
- d[u]=;
- return f;
- }
- int Dinic(){
- int res=;
- while(BFS())res+=DFS(S,INF);
- return res;
- }
- int id[][],cnt=,ed;
- void init(){
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++)
- id[i][j]=++cnt;
- ed=n*m;
- return;
- }
- int ans=;
- void solve(){
- int i,j,x;
- for(i=;i<=n;i++)
- for(j=;j<=m;j++){
- x=read();ans+=x;
- insert(S,id[i][j],x);//art
- }
- for(i=;i<=n;i++)
- for(j=;j<=m;j++){
- x=read();ans+=x;
- insert(id[i][j],T,x);//science
- }
- for(i=;i<=n;i++)
- for(j=;j<=m;j++){
- x=read();//same_art
- ans+=x;
- for(int k=;k<=;k++){//从0到4
- int nx=i+mx[k],ny=j+my[k];
- if(nx< || nx>n || ny< ||ny>m)continue;
- insert(id[i][j]+ed,id[nx][ny],INF);
- }
- insert(S,id[i][j]+ed,x);
- }
- for(i=;i<=n;i++)
- for(j=;j<=m;j++){
- x=read();//same_sci
- ans+=x;
- for(int k=;k<=;k++){
- int nx=i+mx[k],ny=j+my[k];
- if(nx< || nx>n || ny< ||ny>m)continue;
- insert(id[nx][ny],id[i][j]+*ed,INF);
- }
- insert(id[i][j]+*ed,T,x);
- }
- ans-=Dinic();
- return;
- }
- int main(){
- int i,j,x;
- n=read();m=read();
- S=;T=n*m*+;
- init();
- solve();
- printf("%d\n",ans);
- return ;
- }
Bzoj3894 文理分科的更多相关文章
- [bzoj3894]文理分科_网络流_最小割
文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
- [Bzoj3894]文理分科(最小割)
Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位.每位 ...
- bzoj3894: 文理分科(还是那道最小割)
3894: 文理分科 题目:传送门 感谢波老师没有来D飞我,让我做出了这题... 题解: 这题其实和我做的上一题(bzoj2132)很像,所以就不写题意了. 依然是那最小割... 这题给出了四个利益矩 ...
- 【题解】 bzoj3894: 文理分科 (网络流/最小割)
bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...
- [BZOJ3894]文理分科(最小割)
(1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...
- 【BZOJ3894】文理分科(最小割)
[BZOJ3894]文理分科(最小割) 题面 BZOJ Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个 ...
- 【BZOJ3894】文理分科 最小割
[BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- 【bzoj3894】文理分科 网路流
[bzoj3894]文理分科 2015年3月25日3,4002 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班 ...
随机推荐
- Ionic设置ion-slide-box不启用(不通过$ionicSlideBoxDelegate)
猛地一看这个标题,可能觉得多此一举,直接$ionicSlideBoxDelegate. $getByHandle(handle). enableSlide(false)设置不就行了?是的,按理说就是这 ...
- android的消息提示(震动与提示音)
protected AudioManager audioManager; protected Vibrator vibrator; audioManager = (AudioManager)getSy ...
- pdf文件的导入导出
下面的代码自己本人没有尝试过,只是用来做记录,用到时候再说! 最近碰见个需求需要实现导出pdf文件,上网查了下代码资料总结了以下代码.可以成功的实现导出pdf文件. 在编码前需要在网上下载个itext ...
- mysql
这是 <MySQL 必知必会> 的读书总结.也是自己整理的常用操作的参考手册. 使用 MySQL 连接到 MySQL shell>mysql -u root -p Enter pas ...
- 数据库实战案例—————记一次TempDB暴增的问题排查
前言 很多时候数据库的TempDB.日志等文件的暴增可能导致磁盘空间被占满,如果日常配置不到位,往往会导致数据库故障,业务被迫中断. 这种文件暴增很难排查,经验不足的一些运维人员可能更是无法排查具体原 ...
- JavaScript如何获取网页url中的参数
我们可以自定义一个公共函数来实现网页url中的参数获取,返回的是一个数组 GetUrlRequest: function () { var url = decodeURI(location.searc ...
- [iOS]技巧集锦:UITableView自定义Cell中的控件无法完全对齐Cell的左边界和右边界
这是个很诡异的问题,由于一些特殊需求,我的TableView的Cell的背景色是透明,其中的控件会有背景色,第一个控件和最后一个控件我都用IB自动设了约束,对齐Cell的左边界和右边界,但是自动约束很 ...
- 【原】移动web滑屏框架分享
本月26号参加webrebuild深圳站,会上听了彪叔的对初心的讲解,“工匠精神”这个词又一次被提出,也再次引起了我对它的思考.专注一个项目并把它做得好,很好,更好...现实工作中,忙忙碌碌,抱着完成 ...
- 多线程IP获取工具(C#)
以前帮一个朋友写的“IP采集工具”! Control.CheckForIllegalCrossThreadCalls = false; 多线程,测试后还比较稳定. 500线程时候,CPU5%左右,内存 ...
- 三维网格精简算法(Quadric Error Metrics)附源码
在计算机图形应用中,为了尽可能真实呈现虚拟物体,往往需要高精度的三维模型.然而,模型的复杂性直接关系到它的计算成本,因此高精度的模型在几何运算时并不是必须的,取而代之的是一个相对简化的三维模型,那么如 ...