题面:

高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科,那么他们又将收获一些喜悦值。作为计算机竞赛教练的scp大老板,想知道如何分配可以使得全班的喜悦值总和最大。


题解:

  1. 我们考虑用最小割解决问题.先把所有收益相加,再减去损失的代价。
  2. 因为每个人只有两种选择就是很典型的最小割去解决二元关系集合冲突模型
  3. 考虑用网络流求解,总量减去最小割即为答案。
    对于每个点 (i,j),从 s 连一条容量为选择文科的边,到 tt 连一条容量位选择理科的边。
    对于 (i,j) 和 (i+1,j) 两个点的组合情况。假设这两个点同时选文科有 w 的喜悦值,我们新建一个节点 x,从 s 向 x 连一条容量为喜悦值 w 的边,再从 x 向 (i,j) 和 (i+1,j) 分别连一条容量为 INF 的边。对于左右前后、文科理科同理!
    考虑这样做法的正确性:每个点自然只能选择一个科目(文科或理科),当某个点选择了文科 s,那么它向理科 t 的边都应该要被断开。考虑哪些边会被断开:首先是它直接连向 t 的边,其次是它和别的点组合连向 t 的边,这样一来,这些边在网络图的割中是有贡献的,意味着这些边的容量在答案中没有贡献,正确性证明完毕。

#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define f first
#define s second
#define endl '\n'
using namespace std;
const int N = 2e6 + 10, mod = 1e9 + 9;
const int maxn = N;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x) {x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)  {read(first);read(args...);
}
struct node {int to, next, len;
}e[maxn];
int head[maxn], cnt;
int n, m, s, t;
inline void add(int from, int to, int len) {e[cnt] = {to,head[from],len};head[from] = cnt ++;
}int d[maxn],cur[maxn];
int pre[maxn], flow[maxn];bool bfs() {ms(d,0);queue<int> q;q.push(s); d[s] = 1;while(!q.empty()) {int u = q.front(); q.pop();for(int i = head[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[v] || e[i].len <= 0) continue;q.push(v);d[v] = d[u] + 1;}}      for(int i = 0; i <= t; ++ i) cur[i] = head[i];return d[t] != 0;
}int dfs(int u, int flow) {if(u == t) return flow;for(int &i = cur[u]; ~i; i = e[i].next) {int v = e[i].to;if(d[u] + 1 != d[v] || e[i].len <= 0) continue;int delta = dfs(v,min(flow,e[i].len));if(delta <= 0) continue;e[i].len -= delta;e[i^1].len += delta;return delta;}return 0;
}int get_maxflow() {int maxFlow = 0, delta;while(bfs())//bfs进行构建最短路网络while(delta = dfs(s,INF))maxFlow += delta;return maxFlow;
}
int Tn, Tm;
int sum;
inline int getid(int i, int j) {return (i - 1) * Tm + j;
}
int main() {IOS;ms(head,-1);cin >> Tn >> Tm;s = 0, t = Tn*Tm+(Tn-1)*Tm*2+Tn*(Tm-1)*2 + 1;for(int i = 1; i <= Tn; ++ i)for(int j = 1; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);add(s,id,x);add(id,s,0);}for(int i = 1; i <= Tn; ++ i)for(int j = 1; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);add(id,t,x);add(t,id,0);}int idx = Tn * Tm + 1;for(int i = 2; i <= Tn; ++ i) for(int j = 1; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);int id2 = getid(i-1,j);add(s,idx,x);add(idx,s,0);add(idx,id,INF);add(id,idx,0);add(idx,id2,INF);add(id2,idx,0);idx++;}for(int i = 2; i <= Tn; ++ i) for(int j = 1; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);int id2 = getid(i-1,j);add(t,idx,0);add(idx,t,x);add(idx,id,0);add(id,idx,INF);add(idx,id2,0);add(id2,idx,INF);idx++;}for(int i = 1; i <= Tn; ++ i) for(int j = 2; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);int id2 = getid(i,j-1);add(s,idx,x);add(idx,s,0);add(idx,id,INF);add(id,idx,0);add(idx,id2,INF);add(id2,idx,0);idx++;}for(int i = 1; i <= Tn; ++ i) for(int j = 2; j <= Tm; ++ j) {int x;cin >> x;sum += x;int id = getid(i,j);int id2 = getid(i,j-1);add(t,idx,0);add(idx,t,x);add(idx,id,0);add(id,idx,INF);add(idx,id2,0);add(id2,idx,INF);idx++;}cout << sum - get_maxflow();return 0;
}

最小割 ---- 集合冲突模型 ----- P1646 [国家集训队]happiness相关推荐

  1. 最小割 ---- 集合冲突模型 ---- AGC038 F - Two Permutations[详解]

    题目链接 题目大意: 给出两个排列P,QP,QP,Q.要求构造两个排列A,B.A,B.A,B. 要求:AiAiAi要么等于iii,要么等于PiPiPi;BiBiBi要么等于iii,要么等于QiQiQi ...

  2. 最小割 ---- 集合冲突模型

    集合冲突模型 1.问题形式 有 n 个物品和两个集合 S,T.将一个物品放入 S 集合会花费 ai,放入 T 集合会花费 bi.还有若干个形如 u,v,w 限制条件,表示如果 u 和 v 同时不在一个 ...

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

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

  4. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  5. [国家集训队]happiness 最小割 BZOJ 2127

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

  6. 最大权闭合子图(最小割模型)

    1,定义: 1,最大权闭合子图是最小割的一个模型.即每一个子图中的每一个点,其出边的点也全应该在这个子图中.而所有子图中,其点的权值和最大就是最大权闭合子图. 2,构建该图,我们把所有正权值点与源点s ...

  7. SPOJ-OPTM Optimal Marks ★★(按位建图 最小割)

    [题意]给出一个无向图,每个点有一个标号mark[i],不同点可能有相同的标号.对于一条边(u, v),它的权值定义为mark[u] xor mark[v].现在一些点的标号已定,请决定剩下点的标号, ...

  8. Bzoj 2127 happiness 最小割

    happiness 题解: 将图转换成最小割. 将割完的图中与S相连的点看做选文科, 与T相连的点看做选理科. flow(s, u) = 文科值 flow(u,t) = 理科值 假设u 和 v 一起选 ...

  9. BZOJ 2039: [2009国家集训队]employ人员雇佣 最小割 二元组建图模型

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 1614  Solved: 789 [Subm ...

最新文章

  1. 我在亦庄见了说中文的爱因斯坦,会比心的熊猫,还有一场意念打字大赛
  2. [PHP] 内部接口简单加密验证方式
  3. 会话,授权,认证概念解析
  4. [CF452E]Three strings
  5. Everything+ listary+TotalCommander+QTTabBar相互整合
  6. 计算机专业代码933,数学类专业代码
  7. c语言二级java难吗_计算机二级考JAVA还是C?
  8. 爬取豆瓣电影Top 250封面
  9. 超级计算机的生产流程,PCB生产工艺流程,你知道吗?
  10. 第五章 用正三和弦为平稳旋律配和声
  11. snappy格式解析
  12. 吴恩达机器学习第一周测试
  13. Third season twenty-third episode,Ross‘s thing on his butt???
  14. 实验一:Cifar10图像分类竞赛 学习记录
  15. 限定性定语从句和非限定性定语从句的区别
  16. 【MOS】如何利用RMAN可传输表空间迁移数据库到不同字节序的平台(文档 ID 1983639.1)...
  17. A 0.18um CMOS SOC for a 100-m-Range 10-Frame/s 200x96 pixel time-of-flight Depth Sensor翻译
  18. Python 、Sqlite3数据库、单片机 、RC522 -公交卡管理系统(含部分源码)#可刷卡登陆
  19. ES源码学习之--Get API的实现逻辑
  20. 硬盘坏块监测linux,Linux上检测硬盘上的坏道和坏块

热门文章

  1. 汇编语言中带点/小数点的是什么
  2. https://www.exploit-db.com/下载POC比较完善的代码
  3. CENTOS 7 nginx-1.6.2 下载 解压 安装
  4. 推荐 | Pair,医学图像标注神器
  5. 使用PixelLib来实现图像分割
  6. 计算机视觉系统中图像究竟经历了哪些“折磨”
  7. EasyTransaction 1.3.0 发布,一站式分布式事务解决方案
  8. Python-HTML CSS题目
  9. 关系型数据库-三范式
  10. 基于docker+gunicorn部署sanic项目