P4313 文理分科 最小割
$ \color{#0066ff}{ 题目描述 }$
文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过)
小P所在的班级要进行文理分科。他的班级可以用一个n*m的矩阵进行描述,每个格子代表一个同学的座位。每位同学必须从文科和理科中选择一科。同学们在选择科目的时候会获得一个满意值。满意值按如下的方式得到:
- 如果第i行第秒J的同学选择了文科,则他将获得art[i][j]的满意值,如果选择理科,将得到science[i][j]的满意值。
- 如果第i行第J列的同学选择了文科,并且他相邻(两个格子相邻当且仅当它们拥有一条相同的边)的同学全部选择了文科,则他会更开心,所以会增加same_art[i][j]的满意值。
- 如果第i行第j列的同学选择了理科,并且他相邻的同学全部选择了理科,则增加same_science[i][j]的满意值。
小P想知道,大家应该如何选择,才能使所有人的满意值之和最大。请告诉他这个最大值。
\(\color{#0066ff}{输入格式}\)
第一行为两个正整数:n,m
接下来n行m个整数,表示art[i][j];
接下来n行m个整数.表示science[i][j];
接下来n行m个整数,表示same_art[i][j];
接下来n行m个整数,表示same_science[i][j];
\(\color{#0066ff}{输出格式}\)
输出为一个整数,表示最大的满意值之和
\(\color{#0066ff}{输入样例}\)
3 4
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
\(\color{#0066ff}{输出样例}\)
152
\(\color{#0066ff}{数据范围与提示}\)
1表示选择文科,0表示选择理科,方案如下:
1 0 0 1
0 1 0 0
1 0 0 0
N,M<=100,读入数据均<=500
\(\color{#0066ff}{题解}\)
根据题目,每个人要么选文,要么选理,当然是最小割了
然后我们考虑建图
首先最基本的,显然可以弄出n*m个点,s向这些点连文科的边,这些点向t连理科的边
割掉哪个哪个不选
对于每一个额外的值,只要那些人中有一个人没符合要求,就必须剪掉!
也就是说,如果不割掉,那么就联通了
可以建立一个虚点,s向虚点连文科额外的分,这个虚点向对应的\(1-5\)个点连inf的边(割不了)
这样的话,理科有一个边没割(代表有人选理)就不会获得文科额外价值,理科同理也建立虚点
最后总共的-最大流(最小割)即可
#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int inf = 0x7ffffff;
const int maxn = 1e5 + 10;
const int maxm = 120;
struct node {
int to, can;
node *nxt, *rev;
node(int to = 0, int can = 0, node *nxt = NULL): to(to), can(can), nxt(nxt) { rev = NULL; }
};
node *head[maxn], *cur[maxn];
int dep[maxn];
int wen[maxm][maxm], li[maxm][maxm], ww[maxm][maxm], ll[maxm][maxm];
int n, m, s, t, tot;
bool bfs() {
for(int i = s; i <= t; i++) dep[i] = 0, cur[i] = head[i];
std::queue<int> q;
dep[s] = 1;
q.push(s);
while(!q.empty()) {
int tp = q.front(); q.pop();
for(node *i = head[tp]; i; i = i->nxt)
if(!dep[i->to] && i->can)
dep[i->to] = dep[tp] + 1, q.push(i->to);
}
return dep[t];
}
int dfs(int x, int change) {
if(x == t || !change) return change;
int flow = 0, ls;
for(node *&i = cur[x]; i; i = i->nxt) {
if(dep[i->to] == dep[x] + 1 && (ls = dfs(i->to, std::min(change, i->can)))) {
flow += ls;
change -= ls;
i->can -= ls;
i->rev->can += ls;
if(!change) break;
}
}
return flow;
}
int id(int x, int y) { return (x - 1) * m + y; }
void add(int from, int to, int can) {
head[from] = new node(to, can, head[from]);
}
void link(int from, int to, int can) {
add(from, to, can), add(to, from, 0);
(head[from]->rev = head[to])->rev = head[from];
}
int dinic() {
int flow = 0;
while(bfs()) flow += dfs(s, inf);
return flow;
}
int main() {
n = in(), m = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
wen[i][j] = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
li[i][j] = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
ww[i][j] = in();
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++)
ll[i][j] = in();
int tot = 0;
s = 0, t = 3 * n * m + 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
tot += wen[i][j];
link(s, id(i, j), wen[i][j]);
tot += li[i][j];
link(id(i, j), t, li[i][j]);
}
int now = n * m;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
now++;
link(s, now, ww[i][j]), tot += ww[i][j];
link(now, id(i, j), inf);
if(i != 1) link(now, id(i - 1, j), inf);
if(i != n) link(now, id(i + 1, j), inf);
if(j != 1) link(now, id(i, j - 1), inf);
if(j != m) link(now, id(i, j + 1), inf);
}
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
now++;
link(now, t, ll[i][j]), tot += ll[i][j];
link(id(i, j), now, inf);
if(i != 1) link(id(i - 1, j), now, inf);
if(i != n) link(id(i + 1, j), now, inf);
if(j != 1) link(id(i, j - 1), now, inf);
if(j != m) link(id(i, j + 1), now, inf);
}
printf("%d\n", tot - dinic());
return 0;
}
P4313 文理分科 最小割的更多相关文章
- BZOJ 3894 Luogu P4313 文理分科 (最小割)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=3894 (luogu) https://www.luogu.org/pro ...
- BZOJ3894文理分科——最小割
题目描述 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠 结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行 描述,每个格子代表一个同学的座位.每位同学必须从 ...
- BZOJ 3894: 文理分科 [最小割]
3894: 文理分科 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 674 Solved: 392[Submit][Status][Discuss] ...
- 【BZOJ3894】【Luogu3358】文理分科 - 最小割多选一模型
链接Click Here 这个题就是个板子的最小割多选一模型啦\(QwQ\),这里介绍一种通用的解法. 抛开组合收益不谈,这个题就是一个简单的最小割模型.我们只需要建出来这样一张图,在上面跑最小割,割 ...
- 【BZOJ3894】文理分科 最小割
[BZOJ3894]文理分科 Description 文理分科是一件很纠结的事情!(虽然看到这个题目的人肯定都没有纠结过) 小P所在的班级要进行文理分科.他的班级可以用一个n*m的矩阵进行描述,每个格 ...
- [BZOJ3894]文理分科(最小割)
(1) 对每个位置建一个点F1,S向这个点连art[i][j]的边,这个点向T连science[i][j]的边. (2) 对每个位置再建一个点F2,S向这个点连same_art[i][j]的边,这个点 ...
- BZOJ3894/LuoguP4313 文理分科 (最小割)
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> ...
- P4313 文理分科
思路 遇到这种利益冲突的最终利益最大化问题 考虑转化为最小割,使得损失的价值最小 相当于文科是S,理科是T,选出最小割就是确定损失代价最小的方案 然后就把S向每个点连一条cap=art[i][j]的边 ...
- Luogu P4313 文理分科
link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...
随机推荐
- 实例解说Linux命令行uniq
Linux命令uniq的作用是过滤重复部分显示文件内容,这个命令读取输入文件,并比较相邻的行.在正常情况下,第二个及以后更多个重复行将被删去,行比较是根据所用字符集的排序序列进行的.该命令加工后的结果 ...
- cxf和axis2使用有感
CXF框架 个人不喜欢使用wsimport工具: 1.考虑到远端的服务接口发生变化,本地的接口还需要重新同步下 2.项目中无端多了些冗余的代码 这样我们选择cxf的动态调用接口吧,使用DynamicC ...
- 修改eclipse默认workspace
三种方法 (只改其一可能无效,最好都试试) 1. 修改exlipse安装目录下\configuration\.settings\org.eclipse.ui.ide.prefs文件,修改RECENT_ ...
- random和os模块
一.random模块 常用方法如下: #-*- coding:utf-8 -*- import random print(random.randint(1,100)) # 获取一个范围内的随机数,包含 ...
- 从SQL Server中清除msdb备份和恢复记录
正如我在前面的技巧“您的数据库上次恢复是什么时候呢?”中提到的,SQL Server使msdb数据库内系统表中的备份和恢复记录保持激活状态.没有正常的维护,这些系统表将变得很大,从而导致对于msdb数 ...
- Java虚拟机(一):JVM的运行机制
一.JVM启动流程 通过java +xxx(或javaw)启动java虚拟机 装载配置,会在当前路径中寻找jvm的config配置文件. 根据查找jvm.dll文件.这个文件就是java虚拟机的主要实 ...
- spring 项目返回406
406 The resource identified by this request is only capable of generating responses with characteris ...
- ubuntu16.04 ARM平台移植xmlrpc-c1.39.12
1. xmlrpc-c依赖与libcurl 参考另外一篇随笔:https://www.cnblogs.com/flyinggod/p/10148228.html 2. 下载源代码 http://xml ...
- Learning from Imbalanced Classes
https://www.svds.com/learning-imbalanced-classes/ 下采样即 从大类负类中随机取一部分,跟正类(小类)个数相同,优点就是降低了内存大小,速度快! htt ...
- 自定义JTabbedPane 标签风格
自定义JTabbedPane 标签风格 2012年03月09日 20:33:12 阅读数:2435 demo 下载地址:http://download.csdn.net/detail/jinannan ...