网络流--最大流--hlpp(预流推进)模板
//500ms 秒掉洛谷推流问题
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
typedef long long LL;
typedef long long F_type;
const int MAXN = 1.2e3 + 10, INF = 0x3f3f3f3f;
const LL LINF = (LL)INF << 32 | INF;
struct Edge
{int v, rev;F_type cap;Edge(int a, F_type b, int c) : v(a), rev(c), cap(b) {}
};
const F_type maxf=LINF;
F_type exflow[MAXN];
int h[MAXN], cnt[MAXN];
int ht, N, S, T, labelcnt;
vector<Edge> G[MAXN];
vector<int> hq[MAXN];
void clear(int n = MAXN - 1)
{ht = labelcnt = 0;for (int i = 0; i <= n; i++)G[i].clear();
}
void addEdge(int u, int v, F_type cap)
{G[u].emplace_back(v, cap, G[v].size());G[v].emplace_back(u, 0, G[u].size() - 1);
}
void update(int u, int newh)
{++labelcnt;if (h[u] != N + 1)--cnt[h[u]];h[u] = newh;if (newh == N + 1)return;++cnt[ht = newh];if (exflow[u] > 0)hq[newh].push_back(u);
}
void globalRelabel()
{queue<int> q;for (int i = 0; i <= N + 1; i++)hq[i].clear();for (int i = 0; i <= N; i++)h[i] = N + 1, cnt[i] = 0;q.push(T);labelcnt = ht = h[T] = 0;while (!q.empty()){int u = q.front();q.pop();for (Edge& e : G[u]){if (h[e.v] == N + 1 && G[e.v][e.rev].cap){update(e.v, h[u] + 1);q.push(e.v);}}ht = h[u];}
}
void push(int u, Edge& e)
{if (exflow[e.v] == 0)hq[h[e.v]].push_back(e.v);F_type df = min(exflow[u], e.cap);e.cap -= df;G[e.v][e.rev].cap += df;exflow[u] -= df;exflow[e.v] += df;
}
void discharge(int u)
{int nxth = N + 1;for (Edge& e : G[u])if (e.cap){if (h[u] == h[e.v] + 1){push(u, e);if (exflow[u] <= 0)return;}elsenxth = min(nxth, h[e.v] + 1);}if (cnt[h[u]] > 1)update(u, nxth);elsefor (; ht >= h[u]; hq[ht--].clear()){for (int& j : hq[ht])update(j, N + 1);}
}
F_type maxFlow(int s, int t, int n)
{S = s, T = t, N = n;memset(exflow, 0, sizeof(exflow));exflow[S] = maxf;exflow[T] = -maxf;globalRelabel();for (Edge& e : G[S])push(S, e);for (; ht >= 0; --ht){while (!hq[ht].empty()){int u = hq[ht].back();hq[ht].pop_back();discharge(u);if (labelcnt > (N << 2))globalRelabel();}}return exflow[T] + maxf;
}int main()
{int n, m, s, t, u, v, w;scanf("%d%d%d%d", &n, &m, &s, &t);while (m--){scanf("%d%d%d", &u, &v, &w);addEdge(u, v, w);}printf("%d", maxFlow(s, t, n));return 0;
}
网络流--最大流--hlpp(预流推进)模板相关推荐
- 最大流算法——预流推进
http://xingzheqiang.blog.163.com/blog/static/20561012520127464654159/ 背景知识不明者找Google. -------------- ...
- [洛谷P4722]【模板】最大流 加强版 / 预流推进
会$TLE$... C++ Code:(HLPP) #pragma GCC optimize(3) #pragma GCC optimize("unroll-loops") #in ...
- 算法学习笔记:网络流#4——ISAP 求解最大流
算法学习笔记:网络流#4--ISAP 求解最大流 1. 前言 2. 模板 2.1 详解 2.2 正确性证明 2.3 代码 3. 算法对比 3.1 一般数据下的对比 3.2 特殊数据下的对比 4. 总结 ...
- 最大流——HLPP算法
名字长,跑得快:最高标号预流推进算法! 最高标号预流推进算法High Level Preflow Push是最大流里最快的算法.我是偶然在网上看到这个算法的,其时间复杂度达到了令人发指的O(|E|²* ...
- .net 流(Stream) - 文件流、内存流、网络流
一.文件流 FileStream FileStream流继承与Stream类,一个FileStream类的实例实际上代表一个文件流,使用FileStream类可以对文件系统上是文件进行读取.写入.打开 ...
- C#数据流:文件流、内存流、网络流
全栈工程师开发手册 (作者:栾鹏) c#教程全解 C#编程中数据流的使用一直不很熟练,没有一个系统的认识,但是它的重要性显然不言而喻.System.IO下的Stream类是所有数据流的基类,当我们对数 ...
- RTSP协议详解与实时流视频预览-第6/11季视频课程-海思-朱有鹏-专题视频课程
RTSP协议详解与实时流视频预览-第6/11季视频课程-海思-383人已学习 课程介绍 本季详细讲解RTSP协议的技术细节,并且编程实现基于RTSP协议的实时视频流传输,在局域网内浏览 ...
- 学习笔记:网络流基础:理解最大流/最小割定理 (蒋炎岩)
网络流基础:理解最大流/最小割定理 蒋炎岩 课程链接 有向图的基本概念: 问题引入 直观感受反例 引入重要概念: 割的示例 小结 再来一个问题 例子 可以找到一条路径的情况 可以找到两条路径的情况 问 ...
- 使用layui在前端接收后端的图片流来显示二维码,在前端使用iframe接收后端流来预览pdf
消息弹框的形式 因为我是在生成二维码之后,用zxing的工具类输出的流 所以这里介绍一下我用到的工具类的依赖 gradle // https://mvnrepository.com/artifact/ ...
- 网络流__4 上下界可行流
网络流 __4 上下界可行流 对于容量有上下界规范的网络流问题 无源汇上下界可行流 n个点m条边的有向图,每条边有一个流量下界和流量上界规范,求是否存在一个可行流 设原网络为(G,F),变换后网络为( ...
最新文章
- 介绍一本零基础入门Python数据分析的书
- c#获取DataTable某一列不重复的值,或者获取某一列的所有值
- ninject 的 实现 的 理解
- 剑指offer之36-40题解
- Android之Debug运行项目一直卡在Debug界面(can‘t bind to local 8066 for debug)
- SpringCloud与Seata分布式事务初体验
- 波兰表达式(前序表达式)的计算(栈)
- IIS+ASP部署相关
- 换到GitHub 博客了
- ExtJs学习笔记(2)_Basic GridPanel[基本网格]
- scala入门学习之类的使用
- 办公软件excel表格_EXCEL表格模板下载推荐?办公资源网优质海量素材资源免费下载...
- 怎样学好高中数学,2019高考数学真题解题技巧
- Unity如何接入应用内购In-AppPurchase
- erp仓储管理 java,关于java:ERP仓库管理的操作与设计开源软件诞生20
- 微博快捷登录提示21322重定向地址不匹配(解决方案)
- 源码网站合集[细选过的][转贴]
- 远程视频监控组网方案:4G工业设备实现林区中心端汇聚!
- Vue动态修改网页浏览器标签的标题和图标
- ABCD四个人说真话的概率都是1/3。假如A声称B否认C说D是说谎了,那么D说过的那句话真话的概率是多少