题目描述
高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。

作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。

输入格式
第一行两个正整数n,m。

接下来是六个矩阵

第一个矩阵为n行m列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择文科获得的喜悦值。

第二个矩阵为n行m列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学选择理科获得的喜悦值。

第三个矩阵为n-1行m列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择文科获得的额外喜悦值。

第四个矩阵为n-1行m列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i+1行第j列的同学同时选择理科获得的额外喜悦值。

第五个矩阵为n行m-1列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择文科获得的额外喜悦值。

第六个矩阵为n行m-1列
此矩阵的第i行第j列的数字表示座位在第i行第j列的同学与第i行第j+1列的同学同时选择理科获得的额外喜悦值。

输出格式
输出一个整数,表示喜悦值总和的最大值

输入

1 2
1 1
100 110
1
1000

输出

1210

说明/提示
【样例说明】

两人都选理,则获得100+110+1000的喜悦值。

对于100%以内的数据,n,m<=100 所有喜悦值均为小于等于5000的非负整数

解题:这道题与luogu P1361是用相同的做法。
这道题的做法是,对于每个同学,连一条边到理科,连一条边到文科,而对于其他的矩阵(一个同学和其他同学同时选理科或文科得到的值),新建一个点,然后连向相应的分科的点,最后我们选择割一条边,就相当于将那个点割到一个集合,我们要求剩下的值最大,也就是减去最少的边,使得源点和汇点不连通,所以求最小割即可。

代码:

#pragma GCC optimize(2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <stack>
#include <bitset>
#include <queue>
#include <cstdio>
//#include <random>
#include <time.h>
using namespace std;
//std::mt19937 rnd(233);
#define pp pair<int,int>
#define ull unsigned long long
#define ls root<<1
#define rs root<<1|1
//#define int long long
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int NINF = 0xc0c0c0c0;
const int maxn =1e5+7;
const int Maxn = 5e6+7;
const double eps=1e-6;
const int mod=1e9+7;
struct edge{int v,w,next;
}e[Maxn];
int head[maxn],cnt=1,cur[maxn],n,m,s,t,dis[maxn];
int tot;
void add(int a,int b,int c){e[++cnt]=edge{b,c,head[a]};head[a]=cnt;//cout<<a<<' '<<b<<' '<<c<<endl;
}
bool bfs(){for(int i=0;i<=tot+1;i++)dis[i]=0;dis[s]=1;queue<int> q;q.push(s);//cout<<s<<endl;while(q.size()){int u=q.front();q.pop();for(int i=head[u];i;i=e[i].next){int v=e[i].v,w=e[i].w;if(w>0 && !dis[v]){dis[v]=dis[u]+1;q.push(v);if(v==t)return 1;}}}return 0;
}int dfs(int u,int flow){//if(u==t)cout<<"---";//cout<<flow<<endl;if(!flow || u==t)return flow;int tflow=0;for(int i=head[u];i;i=e[i].next){cur[u]=e[i].next;int v=e[i].v,w=e[i].w;if(!w)continue;if(dis[v]!=dis[u]+1)continue;int tmp=dfs(v,min(flow,w));e[i].w-=tmp;e[i^1].w+=tmp;flow-=tmp;tflow+=tmp;if(!flow)break;}if(!tflow)dis[u]=0;return tflow;
}signed main(){scanf("%d%d",&n,&m);s=0,t=n*m+2*n*(m-1)+2*(n-1)*m+1;//cout<<t<<endl;tot=n*m;int res=0,x;for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(s,a,x);add(a,s,0);}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(a,t,x);add(t,a,0);}for(int i=1;i<n;i++)for(int j=1;j<=m;j++){++tot;scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(s,tot,x);add(tot,s,0);add(tot,a,inf);add(a,tot,0);add(tot,a+m,inf);add(a+m,tot,0);}for(int i=1;i<n;i++)for(int j=1;j<=m;j++){++tot;scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(tot,t,x);add(t,tot,0);add(a,tot,inf);add(tot,a,0);add(a+m,tot,inf);add(tot,a+m,0);}for(int i=1;i<=n;i++)for(int j=1;j<m;j++){++tot;scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(s,tot,x);add(tot,s,0);add(tot,a,inf);add(a,tot,0);add(tot,a+1,inf);add(a+1,tot,0);}for(int i=1;i<=n;i++)for(int j=1;j<m;j++){++tot;scanf("%d",&x);res+=x;int a=(i-1)*m+j;add(tot,t,x);add(t,tot,0);add(a,tot,inf);add(tot,a,0);add(a+1,tot,inf);add(tot,a+1,0);}int ans=0,flow;while(bfs()){//for(int i=0;i<=tot;i++)cur[i]=head[i];while(flow=dfs(s,inf))ans+=flow;//cout<<"--"<<endl;}//cout<<res<<' '<<ans<<endl;cout<<res-ans<<endl;
}

小记:这道题建图方法和小M的作物那道题是一样的,但是写这道题的时候,还是出了一些问题,最开始找了挺久也没有找出来,最后重新写了一遍,但是 因为使用了cur数组,后面的样例都T了,所以有些时候cur数组对于优化是没有贡献的。

luogu P1646 happiness相关推荐

  1. ZJOI2019一轮停课刷题记录

    Preface 菜鸡HL终于狗来了他的省选停课,这次的时间很长,暂定停到一试结束,不过有机会二试的话还是可以搞到4月了 这段时间的学习就变得量大而且杂了,一般以刷薄弱的知识点和补一些新的奇怪技巧为主. ...

  2. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

  3. 最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness

    题面: 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科 ...

  4. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  5. [Luogu] 选学霸

    https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...

  6. Luogu 2470 [SCOI2007]压缩

    和Luogu 4302 [SCOI2003]字符串折叠 差不多的想法,区间dp 为了计算方便,我们可以假设区间[l, r]的前面放了一个M,设$f_{i, j, 0/1}$表示区间$[i, j]$中是 ...

  7. 【Luogu】P1613 跑路

    [Luogu]P1613 跑路 一.题目 题目描述 小A的工作不仅繁琐,更有苛刻的规定,要求小A每天早上在6:00之前到达公司,否则这个月工资清零.可是小A偏偏又有赖床的坏毛病.于是为了保住自己的工资 ...

  8. Luogu P6055 [RC-02] GCD(莫比乌斯反演,杜教筛)(这题乐死我了,真就图一乐呗)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Weblink https://www.luogu.com.cn/problem/P6055 Prob ...

  9. Luogu P3177 [HAOI2015] 树上染色(树上背包)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...

最新文章

  1. 区块链还可以这么玩?“点亮莫高窟”背后的腾讯云区块链
  2. 数据库SQL Server2012笔记(二)——表的管理
  3. KVM配置之(3)- 克隆
  4. linux 内存占用_分享Linux内存占用几个案例
  5. 曾小伟:谁没被“不可思议”的薪资吸引过?
  6. FastCgi与PHP-fpm之间的关系
  7. 前端学习(224):iconfont矢量库
  8. 计算机桌面设计总结及体会,计算机基础学习心得
  9. 那些把公司当家的程序员,后来怎么样了...
  10. 微信第三方登陆,无需注册一键登录,获取用户信息,PHP实现方法
  11. python --while 练习3
  12. Starling滤镜合集2(新增7种滤镜)
  13. 【使用Idea打包war包】
  14. 基于51单片机的智能路灯照明控制系统proteus仿真原理图程序设计
  15. window.open() 打开IE缓慢的原因
  16. 2-1 Socket家族的基石
  17. uniapp中使用网页录音并上传声音文件(发语音)——js-audio-recorder的使用【伸手党福利】
  18. 利用DirectShow开发C#版的音频文件播放器(补充完善)
  19. PTN/IPRAN技术介绍及发展史
  20. MySQL数据库的基本操作-创建(create database)、选择(use)、查看(shows database)、删除(drop database)

热门文章

  1. 【汇正财经】沪深创全线上涨
  2. 朋友圈仅三天可见?怎么破?
  3. 面试-cookies和session
  4. Linux下为知笔记和蚂蚁笔记测评,推荐蚂蚁笔记!(非广告)
  5. hive1.2.1实战操作电影大数据!
  6. 基于YoloV5的钢筋计数
  7. 游戏数据运营--3. 游戏关键数据指标
  8. java 做的简易进制计算器
  9. 迅捷CAD编辑器:绘制一份漂亮的CAD图纸也很简单
  10. 考研数学-武忠祥每日一题