【BZOJ3894】 文理分科
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
Solution
试机的时候写的。。。贾教流。
对于一个集合选or不选产生的代价/价值可以通过新建附加点来解决。
Code
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <algorithm>
- #define R register
- #define filename ""
- #define maxn 100010
- #define maxm 600010
- #define inf 0x7fffffff
- #define dmin(_a, _b) ((_a) < (_b) ? (_a) : (_b))
- struct Edge {
- Edge *next, *rev;
- int to, cap;
- } *cur[maxn], *last[maxn], e[maxm], *ecnt = e;
- inline void link(R int a, R int b, R int w)
- {
- *++ecnt = (Edge) {last[a], ecnt + , b, w}; last[a] = ecnt;
- *++ecnt = (Edge) {last[b], ecnt - , a, }; last[b] = ecnt;
- }
- const int dx[] = {, -, , }, dy[] = {, , , -};
- int id[][], s, t, ans, q[maxn], dep[maxn], tot;
- inline bool bfs()
- {
- R int head = , tail = ;
- memset(dep, -, (tot + ) << );
- dep[q[] = t] = ;
- while (head < tail)
- {
- R int now = q[++head];
- for (R Edge *iter = last[now]; iter; iter = iter -> next)
- if (iter -> rev -> cap && dep[iter -> to] == -)
- dep[q[++tail] = iter -> to] = dep[now] + ;
- }
- return dep[s] != -;
- }
- int dfs(R int x, R int f)
- {
- if (x == t) return f;
- R int used = ;
- for (R Edge* &iter = cur[x]; iter; iter = iter -> next)
- if (iter -> cap && dep[iter -> to] + == dep[x])
- {
- R int v = dfs(iter -> to, dmin(iter -> cap, f - used));
- iter -> cap -= v;
- iter -> rev -> cap += v;
- used += v;
- if (used == f) return f;
- }
- return used;
- }
- inline void dinic()
- {
- while (bfs())
- {
- memcpy(cur, last, (tot + ) << );
- ans += dfs(s, inf);
- }
- }
- int main()
- {
- // freopen(filename".in", "r", stdin);
- // freopen(filename".out", "w", stdout);
- R int n, m; scanf("%d%d", &n, &m);
- R int anss = ;
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- {
- id[i][j] = ++tot; R int art;
- scanf("%d", &art); link(s, tot, art); anss += art;
- }
- t = ++tot;
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- {
- R int sc; scanf("%d", &sc); anss += sc;
- link(id[i][j], t, sc);
- }
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- {
- R int as; scanf("%d", &as); ++tot; anss += as;
- for (R int k = ; k < ; ++k)
- {
- R int nx = i + dx[k], ny = j + dy[k];
- if (id[nx][ny]) link(tot, id[nx][ny], inf);
- }
- link(tot, id[i][j], inf);
- link(s, tot, as);
- }
- for (R int i = ; i <= n; ++i)
- for (R int j = ; j <= m; ++j)
- {
- R int ss; scanf("%d", &ss); ++tot; anss += ss;
- for (R int k = ; k < ; ++k)
- {
- R int nx = i + dx[k], ny = j + dy[k];
- if (id[nx][ny]) link(id[nx][ny], tot, inf);
- }
- link(id[i][j], tot, inf);
- link(tot, t, ss);
- }
- dinic();
- printf("%d\n", anss - ans);
- return ;
- }
【BZOJ3894】 文理分科的更多相关文章
- [bzoj3894]文理分科_网络流_最小割
文理分科 bzoj-3894 题目大意:题目链接. 注释:略. 想法: 这种题也是一种套路. 我们新建一个点表示收益点. 然后把所有的收益都加一起,求最小割表示代价即可. Code: #include ...
- Bzoj3894 文理分科
Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 667 Solved: 389 Description 文理分科是一件很纠结的事情!(虽然看到这个题 ...
- 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所在的班级要进行文理分科.他的班 ...
随机推荐
- 设计模式之单例模式(Singleton Pattern)
单例模式是最简单的设计模式之一.属于创建型模式,它提供了一种创建对象的最佳方式.使应用中只存在一个对象的实例,并且使这个单实例负责所有对该对象的调用.这种模式涉及到一个单一的类,该类负责创建自己的对象 ...
- [LeetCode] 223.矩形面积
题目链接: https://leetcode-cn.com/problems/rectangle-area 难度:中等 通过率:41.3% 题目描述: 在 二维 平面上计算出两个 由直线构成的 矩形重 ...
- python中对多态和多态性的理解
python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...
- 10.AutoMapper 之自定义值解析器(Custom Value Resolvers)
https://www.jianshu.com/p/3e7cf1d1f17d 自定义值解析器(Custom Value Resolvers) 虽然AutoMapper涵盖了相当多的目标成员映射方案,但 ...
- 基于Graylog的容器日志监控
Docker日志 当一个容器启动的时候,它其实是docker deamon的一个子进程,docker daemon可以拿到容器里面进程的标准输出,然后通过自身的LogDriver模块来处理,LogDr ...
- LVS负载均衡常用的工作模式有NAT、DR、和TUN三种,其中DR模式性能最为优越,使用最为广泛。
一.安装LVS LVS的编译安装参考本站文章:http://www.linuxe.cn/post-192.html,对于LVS这种功能性软件,在生产中用yum安装也是没有问题的. 1 yum inst ...
- js包装类型的装箱拆箱
https://www.jb51.net/article/155820.htm https://juejin.im/post/5cbaf130518825325050fb0a https://juej ...
- Java 从后向前依次比较两个数组
这是华为往年的一道上机题 题目: 给定两个数组,以及两个数组的长度,要求从最后一个元素开始,依次比较两个数组对应的元素.如果有一个数组较短,则以短数组为准.返回不同元素的个数. 解答: int fun ...
- ubuntu apache https设置
上篇文章已经描述过怎么生成证书,点击这里,直接写怎么设置 1.apache加载ssl模块, # a2enmod ssl 2.启动ssl站点 #a2ensite default-ssl 3.加入监听端口 ...
- java面试题全集(上)
1.面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面.抽象只关注对象有哪些属性和行为,并不关注 ...