[洛谷P4722]【模板】最大流 加强版 / 预流推进
会$TLE$。。。
C++ Code:(HLPP)
- #pragma GCC optimize(3)
- #pragma GCC optimize("unroll-loops")
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #include <queue>
- #define maxn 1210
- #define maxm 120010
- const int inf = 0x3f3f3f3f;
- inline int min(int a, int b) {return a < b ? a : b;}
- namespace Network_Flow {
- int st, ed, MF, n;
- int head[maxn], cnt = 2;
- struct Edge {
- int to, nxt, w;
- } e[maxm << 1];
- inline void addE(int a, int b, int c) {
- e[cnt] = (Edge) {b, head[a], c}; head[a] = cnt;
- e[cnt ^ 1] = (Edge) {a, head[b], 0}; head[b] = cnt ^ 1;
- cnt += 2;
- }
- bool inq[maxn];
- int GAP[maxn << 1], h[maxn];
- int prs[maxn];
- struct cmp {
- inline bool operator () (int a, int b) const {return h[a] < h[b];}
- };
- std::priority_queue<int, std::vector<int>, cmp> q;
- inline bool N(int p) {return p != st && p != ed;}
- inline void Push(int u) {
- const int H = h[u] - 1;
- for (register int i = head[u]; i; i = e[i].nxt) {
- int v = e[i].to;
- if (e[i].w && h[v] == H) {
- int w = min(prs[u], e[i].w);
- e[i].w -= w, e[i ^ 1].w += w;
- prs[u] -= w, prs[v] += w;
- if (v != st && v != ed && !inq[v]) {
- q.push(v);
- inq[v] = true;
- }
- if (!prs[u]) return ;
- }
- }
- }
- inline void Gap(int H) {
- for (register int i = 1; i <= n; i++) if (N(i) && H < h[i] && h[i] <= n) h[i] = n + 1;
- }
- namespace BFS {
- int Q[maxn], H, T;
- inline bool bfs() {
- memset(h, 0x3f, sizeof h);
- h[Q[H = T = 0] = ed] = 1;
- while (H <= T) {
- int u = Q[H++];
- for (int i = head[u]; i; i = e[i].nxt) {
- int v = e[i].to;
- if (e[i ^ 1].w && h[v] > h[u] + 1) {
- h[v] = h[u] + 1;
- Q[++T] = v;
- }
- }
- }
- return h[ed] != inf;
- }
- }
- inline void relabel(int u) {
- int &H = h[u] = inf;
- for (register int i = head[u]; i; i = e[i].nxt) {
- int v = e[i].to;
- if (e[i].w && h[v] + 1 < H) H = h[v] + 1;
- }
- }
- inline void HLPP(int __S, int __T) {
- st = __S, ed = __T;
- if (!BFS::bfs()) return ;
- h[st] = n;
- for (register int i = 1; i <= n; i++) if (h[i] < inf) GAP[h[i]]++;
- for (register int i = head[st]; i; i = e[i].nxt) {
- int v = e[i].to, &w = e[i].w;
- if (!w) continue;
- e[i ^ 1].w += w, prs[st] -= w, prs[v] += w;
- w = 0;
- if (v != ed && !inq[v]) {
- q.push(v);
- inq[v] = true;
- }
- }
- while (!q.empty()) {
- int u = q.top(); q.pop();
- inq[u] = false; Push(u);
- if (!prs[u]) continue;
- if (!--GAP[h[u]]) for (register int i = 1; i <= n; i++) if (i != st && i != ed && h[u] < h[i] && h[i] <= n) h[i] = n + 1; //Gap(h[u]);
- relabel(u); GAP[h[u]]++;
- q.push(u); inq[u] = true;
- }
- MF = prs[ed];
- }
- inline void clear() {
- memset(head, 0, sizeof head); cnt = 2;
- memset(GAP, 0, sizeof GAP); memset(prs, 0, sizeof prs);
- while (!q.empty()) q.pop();
- MF = 0;
- }
- }
- #define read() R::READ()
- #include <cctype>
- namespace R {
- int x;
- #ifdef ONLINE_JUGER
- #define M 1 << 25
- char op[M], *ch;
- inline void init() {fread(ch = op, 1, M, stdin);}
- inline int READ() {
- while (isspace(*ch)) ch++;
- for (x = *ch & 15, ch++; isdigit(*ch); ch++) x = x * 10 + (*ch & 15);
- return x;
- }
- #undef M
- #else
- char ch;
- inline int READ() {
- ch = getchar();
- while (isspace(ch)) ch = getchar();
- for (x = ch & 15, ch = getchar(); isdigit(ch); ch = getchar()) x = x * 10 + (ch & 15);
- return x;
- }
- #endif
- }
- int n, m, st, ed;
- int main() {
- #ifdef ONLINE_JUGER
- R::init();
- #endif
- Network_Flow::n = read(), m = read(), st = read(), ed = read();
- for (register int i = 0, a, b, c; i < m; i++) {
- a = read(), b = read(), c = read();
- Network_Flow::addE(a, b, c);
- }
- Network_Flow::HLPP(st, ed);
- printf("%d\n", Network_Flow::MF);
- return 0;
- }
[洛谷P4722]【模板】最大流 加强版 / 预流推进的更多相关文章
- 洛谷P2045 方格取数加强版(费用流)
题意 题目链接 Sol 这题能想到费用流就不难做了 从S向(1, 1)连费用为0,流量为K的边 从(n, n)向T连费用为0,流量为K的边 对于每个点我们可以拆点限流,同时为了保证每个点只被经过一次, ...
- 洛谷 - P2045 - 方格取数加强版 - 费用流
原来这种题的解法是费用流. 从一个方格的左上走到右下,最多走k次,每个数最多拿走一次. 每次走动的流量设为1,起始点拆点成限制流量k. 每个点拆成两条路,一条路限制流量1,费用为价值相反数.另一条路无 ...
- 洛谷P4014 分配问题【最小/大费用流】题解+AC代码
洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...
- 洛谷P3373 [模板]线段树 2(区间增减.乘 区间求和)
To 洛谷.3373 [模板]线段树2 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.将某区间每一个数乘上x 3.求出某区间每一个数的和 输入输出格式 输入格 ...
- 洛谷P1120 小木棍 [数据加强版](搜索)
洛谷P1120 小木棍 [数据加强版] 搜索+剪枝 [剪枝操作]:若某组拼接不成立,且此时 已拼接的长度为0 或 当前已拼接的长度与刚才枚举的长度之和为最终枚举的答案时,则可直接跳出循环.因为此时继续 ...
- 洛谷-P5357-【模板】AC自动机(二次加强版)
题目传送门 -------------------------------------- 过年在家无聊补一下这周做的几道AC自动机的模板题 sol:AC自动机,还是要解决跳fail边产生的重复访问,但 ...
- 图论--网络流--最大流 洛谷P4722(hlpp)
题目描述 给定 nn 个点,mm 条有向边,给定每条边的容量,求从点 ss 到点 tt 的最大流. 输入格式 第一行包含四个正整数nn.mm.ss.tt,用空格分隔,分别表示点的个数.有向边的个数.源 ...
- 洛谷 P4016负载平衡问题【费用流】题解+AC代码
洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...
- 洛谷P3375 [模板]KMP字符串匹配
To 洛谷.3375 KMP字符串匹配 题目描述 如题,给出两个字符串s1和s2,其中s2为s1的子串,求出s2在s1中所有出现的位置. 为了减少骗分的情况,接下来还要输出子串的前缀数组next.如果 ...
随机推荐
- 网站如何使用https
阿里云提供了免费的证书, 先去申请免费的https证书 https://common-buy.aliyun.com/?spm=5176.10695662.958455.3.1f0c7d54HhNTG4 ...
- STM32CubeMx配置USART注意的一个问题
HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, Number);意思是接收到Number个字节后,触发HAL_UART_RxCpltCal ...
- 转:python教程专题资源免费下载整理合集收藏
python教程专题资源免费下载整理合集收藏 < Python学习手册(第4版)>(Learning Python, 4th Edition)[PDF] 94MB 简体中文 <Pyt ...
- List集合中的对象比较,取出不同对象
今天在做金碟系统与我们系统的对接的时候需要做一个客户同步 在同步时,需要比较对象,对查询出的数据库的数据进行比较 for(int i=0;i<list2.size();i++){ if(! li ...
- python 推导式的用法
推导式看了不少,可每次都有新发现 例子1:返回满足条件为真,否则为假 try_list = [1, 2, 3, 4, 5] # 前2种一样, [a > 3 for a in b] [True i ...
- 为WPF中DropShadowBitmapEffect提供轻量级的替代品
原文:为WPF中DropShadowBitmapEffect提供轻量级的替代品 为WPF中DropShadowBitmapEffect提供轻量级的替代品 ...
- 5 多线程 模拟qq聊天
1.多线程思路 使用多线程完成一个全双工的QQ聊天程序 2.版本1:程序小框架 #1.收数据,然后打印 def recvData(): pass #2.检测键盘,发数据 def sendData(): ...
- 大数据培训班 cloudera公司讲师面对面授课 CCDH CCAH CCP
大数据助力成就非凡.大数据正在改变着商业游戏规则,为企业解决传统业务问题带来变革的机遇.毫无疑问,当未来企业尝试分析现有海量信息以推动业务价值增值时,必定会采用大数据技术. 目前对大数据的分析工具,首 ...
- 「日常训练」 Soldier and Cards (CFR304D2C)
题意 (Codeforces 546C) 按照指定的规则打牌,问谁胜或无穷尽. 分析 又是一条模拟,用set+queue(这里手写了)处理即可.注意到两种局势"1 234"和&qu ...
- HDFS常用文件操作
put 上传文件 hadoop fs -put wordcount.txt /data/wordcount/ text 查看文件内容 hadoop fs -text /output/wo ...