热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ISAP模板(网络流模板)

附上学习地址:https:www.luogu.orgblogONE-PIECEjiu-ji-di-zui-tai-liu-suan-fa-isap-yu-hlpp

 附上学习地址:

https://www.luogu.org/blog/ONE-PIECE/jiu-ji-di-zui-tai-liu-suan-fa-isap-yu-hlpp

ISAP过不掉的题:

https://loj.ac/problem/127

const int maxn = 1e4 + 3000;
const int maxm = 4e5 + 10;
const int inf = 1 <<30;
int s, t;
int n, m;
int maxflow;
int cnt, head[maxn], curedge[maxn];
int depth[maxn], gap[maxn];
//depth[i]表示节点i的深度,gap[i]表示深度为i的点的数量
struct Node {int v;int c;int nex;
} edge[maxm];
void init(){cnt = 0;memset(head, -1, sizeof(head));
}
inline void addedge(int u, int v, int c) {//正向建边edge[cnt] = { v, c, head[u] };head[u] = cnt++;//反向建边edge[cnt] = { u, 0, head[v] };head[v] = cnt++;
}
void bfs() { //从t到s进行分层 memset(depth, -1, sizeof(depth));memset(gap, 0, sizeof(gap));depth[t] = 0;gap[0] = 1;queue que;que.push(t);while (!que.empty()) {int u = que.front();que.pop();//遍历u 的所有出边 for (int i = head[u]; i != -1; i = edge[i].nex) {int v = edge[i].v;if (depth[v] != -1) //已经被分过层 continue;que.push(v);depth[v] = depth[u] + 1; // v是u 的下一层 gap[depth[v]]++; //深度为depth[v]的点的数量+1 }}return;
}
int dfs(int u, int flow) {if (u == t) { // 可以到达t maxflow += flow;return flow;}int used = 0; //用来表示这个点的流量用了多少for (int &i = curedge[u]; i != -1; i = edge[i].nex) {int v = edge[i].v;if (edge[i].c && depth[v] + 1 == depth[u]) {int mi = dfs(v, min(edge[i].c, flow - used)); // 找出增广路上最少的流量 if (mi) { // 找到增广路 edge[i].c -= mi; //正向边- edge[i ^ 1].c += mi; //反向边+ used += mi; //当前点流量+ }if (used == flow) //u的能流出的流量流完 return used;}}//前半段和Dinic一模一样//如果已经到了这里,说明该点出去的所有点都已经流过了//并且从前面点传过来的流量还有剩余//则此时,要对该点更改dep//使得该点与该点出去的点分隔开curedge[u] = head[u]; //当前狐优化退回到最初 --gap[depth[u]]; //深度为depth[u] /*这里要解释一下为什么要统计每个深度的点数:为了优化!?统计每个深度对应点数只为了这句话:if (gap[depth[u]] == 0) //出现断层,无法到达t了 depth[s] = n + 1;因为我们是按照深度来往前走的,路径上的点的深度一定是连续的,而t的深度为0,如果某个深度的点不存在,那么我们就无法到达t了*/if (gap[depth[u]] == 0) //出现断层,无法到达t了 depth[s] = n + 1;depth[u]++; // 层数++ gap[depth[u]]++; //层数对应个数++ return used;
}
int ISAP() {maxflow = 0;bfs();for (int i = 0; i <= n; ++i) curedge[i] = head[i];while (depth[s] }

 


推荐阅读
  • 【MySQL】frm文件解析
    官网说明:http:dev.mysql.comdocinternalsenfrm-file-format.htmlfrm是MySQL表结构定义文件,通常frm文件是不会损坏的,但是如果 ... [详细]
  • 问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中 ... [详细]
  • 深入理解iOS中的链式编程:以Masonry为例
    本文通过介绍Masonry这一轻量级布局框架,探讨链式编程在iOS开发中的应用。Masonry不仅简化了Auto Layout的使用,还提高了代码的可读性和维护性。 ... [详细]
  • SSE图像算法优化系列三:超高速导向滤波实现过程纪要(欢迎挑战)
    自从何凯明提出导向滤波后,因为其算法的简单性和有效性,该算法得到了广泛的应用,以至于新版的matlab都将其作为标准自带的函数之一了&#x ... [详细]
  • 笔记说明重学前端是程劭非(winter)【前手机淘宝前端负责人】在极客时间开的一个专栏,每天10分钟,重构你的前端知识体系& ... [详细]
  • 本文详细介绍了 Node.js 中 OS 模块的 arch 方法,包括其功能、语法、参数以及返回值,并提供了具体的使用示例。 ... [详细]
  • 本文探讨了如何在 Spring MVC 框架下,通过自定义注解和拦截器机制来实现细粒度的权限管理功能。 ... [详细]
  • 深入解析C语言中的关键字及其分类
    本文将全面介绍C语言中的关键字,并按照功能将其分为数据类型关键字、控制结构关键字、存储类别关键字和其他关键字四大类,旨在帮助读者更好地理解和运用这些基本元素。C语言中共有32个关键字。 ... [详细]
  • 在尝试加载支持推送通知的iOS应用程序的Ad Hoc构建时,遇到了‘no valid aps-environment entitlement found for application’的错误提示。本文将探讨此错误的原因及多种可能的解决方案。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 长期从事ABAP开发工作的专业人士,在面对行业新趋势时,往往需要重新审视自己的发展方向。本文探讨了几位资深专家对ABAP未来走向的看法,以及开发者应如何调整技能以适应新的技术环境。 ... [详细]
  • 本文探讨了如何将个人经历,特别是非传统的职业路径,转化为职业生涯中的优势。通过作者的亲身经历,展示了舞蹈生涯对商业思维的影响。 ... [详细]
  • 洛谷 P4009 汽车加油行驶问题 解析
    探讨了经典算法题目——汽车加油行驶问题,通过网络流和费用流的视角,深入解析了该问题的解决方案。本文将详细阐述如何利用最短路径算法解决这一问题,并提供详细的代码实现。 ... [详细]
  • 本文探讨了使用lightopenid库实现网站登录,并在用户成功登录后,如何获取其姓名、电子邮件及出生日期等详细信息的方法。特别针对Google OpenID进行了说明。 ... [详细]
  • 二维码的实现与应用
    本文介绍了二维码的基本概念、分类及其优缺点,并详细描述了如何使用Java编程语言结合第三方库(如ZXing和qrcode.jar)来实现二维码的生成与解析。 ... [详细]
author-avatar
没有水的鱼0713
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有