【板子】Dinic(最大网络流)
通用 Dinic 最大流板子#include bits/stdc.h using namespace std; const int N 10005; // 点的数量上限 const int M 200005; // 边的数量上限记得 *2因为要建反向边 const int INF 0x3f3f3f3f; struct Edge { int to, cap, rev; // 终点残量反向边编号 }; vectorEdge g[N]; int depth[N], cur[N]; /* 加边正反两条 */ void add(int u, int v, int cap) { g[u].push_back({v, cap, (int)g[v].size()}); g[v].push_back({u, 0, (int)g[u].size() - 1}); } /* BFS 建层 */ bool bfs(int s, int t) { fill(depth, depth N, -1); queueint q; depth[s] 0; q.push(s); while (q.size()) { int u q.front(); q.pop(); for (auto e : g[u]) { // 注意这里的 if (e.cap 0 depth[e.to] -1) { depth[e.to] depth[u] 1; q.push(e.to); } } } return depth[t] ! -1; } /* DFS 多路增广 */ int dfs(int u, int t, int f) { if (u t) return f; for (int i cur[u]; i g[u].size(); i) { Edge e g[u][i]; // 关键引用直接改原图 if (e.cap 0 depth[e.to] depth[u] 1) { int flow dfs(e.to, t, min(f, e.cap)); if (flow 0) { e.cap - flow; // 正向边减少 g[e.to][e.rev].cap flow; // 反向边增加 return flow; } } } return 0; } /* Dinic 主函数 */ int dinic(int s, int t) { int flow 0; while (bfs(s, t)) { fill(cur, cur N, 0); while (int f dfs(s, t, INF)) { flow f; } } return flow; }用法示例例题P3376【模板】网络最大流洛谷int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, s, t; cin n m s t; for (int i 0; i m; i) { int u, v, w; cin u v w; add(u, v, w); } cout dinic(s, t) \n; return 0; }板子记忆建图 add分层 bfs送水 dfs主循环 dinic关键三处少一个都可能 WA位置为什么for (auto e : g[u])防止 BFS 误拷贝int i cur[u]当前弧优化Edge e g[u][i]核心改原图残量​注意事项N 开够点编号从 1 开始也要保证N max_vertexM 要 ×2因为每条边要建一条反向边多测记得清空for (int i 1; i n; i) g[i].clear();INF 不要开太大0x3f3f3f3f足够且不容易溢出讲解一、怎么存图残量网络边的结构struct Edge { int to; // 这条边指向谁 int cap; // 剩余容量残量 int rev; // 反向边在 to 的邻接表中的下标 };这是什么意思网络流必须支持“反悔”。比如你给u→v流了 5 单位以后你可能想退回去一点。所以我们每条边都配一条反向边正向边cap 剩余容量反向边cap 已流流量rev的作用是快速找到反向边在哪。邻接表存图vectorEdge g[N];g[u]里存的是u 的所有出边。加边函数最重要void add(int u, int v, int cap) { g[u].push_back({v, cap, (int)g[v].size()}); // 正向边 g[v].push_back({u, 0, (int)g[u].size() - 1}); // 反向边 }逐行解释g[u].push_back({v, cap, (int)g[v].size()});从u到v容量是cap反向边在g[v]的第g[v].size()个位置g[v].push_back({u, 0, (int)g[u].size() - 1});反向边容量为 0一开始没流反向边的rev指向刚刚加的正向边以后只要e.cap - f同时g[e.to][e.rev].cap f就完成了“反悔”二、BFS给图“分层”int depth[N]; bool bfs(int s, int t) { fill(depth, depth N, -1); queueint q; depth[s] 0; q.push(s); while (q.size()) { int u q.front(); q.pop(); for (auto e : g[u]) { if (e.cap 0 depth[e.to] -1) { depth[e.to] depth[u] 1; q.push(e.to); } } } return depth[t] ! -1; }这段代码在干嘛depth[v]从源点 s 到 v 的最短距离按边数depth[v] -1表示这个点还没访问到e.cap 0只走还能流的边如果depth[t] -1说明 s 到 t 已经不连通了算法结束三、DFS在分层图上“送水”当前弧数组int cur[N];cur[u]记录u 这个节点我已经尝试到第几条边了DFS 主体int dfs(int u, int t, int f) { if (u t) return f; for (int i cur[u]; i g[u].size(); i) { Edge e g[u][i]; if (e.cap 0 depth[e.to] depth[u] 1) { int ret dfs(e.to, t, min(f, e.cap)); if (ret 0) { e.cap - ret; g[e.to][e.rev].cap ret; return ret; } } } return 0; }一行一行拆if (u t) return f;到了终点直接返回能送的水量for (int i cur[u]; i g[u].size(); i)关键cur[u]是引用修改它会直接保存进度下次再来 u不会从头扫边if (e.cap 0 depth[e.to] depth[u] 1)只走还有容量并且严格向下一层走防止绕圈int ret dfs(e.to, t, min(f, e.cap));能送的水 当前限制f和 边容量e.cap的最小值if (ret 0) { e.cap - ret; // 正向边减 g[e.to][e.rev].cap ret; // 反向边加 return ret; }完成一次增广立刻返回一次 DFS 只送一条增广路但因为有while (dfs(...))会反复调用直到送不动四、Dinic 主函数把一切串起来int dinic(int s, int t) { int flow 0; while (bfs(s, t)) { // 只要还能分层 fill(cur, cur N, 0); // 每一轮重置当前弧 while (int f dfs(s, t, INF)) { flow f; // 累加流量 } } return flow; }这里发生了什么BFS 建层DFS 多路增广阻塞流重复直到无法到达 t 每一轮 BFS 后dfs会被反复调用直到当前分层图被“堵死”。五、一张“对照表”代码 vs 现实代码现实含义Edge::cap水管还能流多少Edge::rev反悔用的反向水管depth[]城市在第几站bfs画地图、编号dfs送水工出发cur[]送水工的小本子while(dfs)把这一层水送干

相关新闻

基于Transformer与微服务架构的AI对话系统开发实践

基于Transformer与微服务架构的AI对话系统开发实践

最近在AI聊天应用领域,不少开发者都在寻找既能满足创意需求又具备稳定免费服务的解决方案。本文将从技术角度全面解析如何构建一个功能完善的AI对话系统,涵盖从架构设计到核心功能实现的完整流程,适合有一定Python基础的开发者学习参考。1. A…

2026/7/16 3:33:38 阅读更多 →
查看佛山AI拓客系统名单:美诚AI多平台分发视频的效率评测

查看佛山AI拓客系统名单:美诚AI多平台分发视频的效率评测

佛山AI拓客系统观察:美诚AI多平台视频分发效率与适用性分析随着数字化营销在佛山及周边地区的深入普及,当地中小企业在筛选佛山中小企业AI拓客系统相关服务商时,关注点正从单纯的功能罗列转向实际运营效率与成本控制的平衡。特别是在短视频成…

2026/7/16 3:33:38 阅读更多 →
进制转换:程序员必备的内功心法,C/Java实现详解

进制转换:程序员必备的内功心法,C/Java实现详解

1. 项目概述:为什么进制转换是程序员的“内功心法”如果你刚开始接触编程,无论是C还是Java,可能都曾被那些以0x、0b开头的数字,或者满屏的%d、%x搞晕过。这背后,就是计算机世界最底层的语言——进制。很多人觉得&#…

2026/7/16 3:33:38 阅读更多 →

最新新闻

YOLOv8 ONNX→TensorRT完整部署教程:C++/Python双接口实现,推理速度提升2倍以上

YOLOv8 ONNX→TensorRT完整部署教程:C++/Python双接口实现,推理速度提升2倍以上

前言:为什么你的YOLOv8部署总是不够快? 在AI模型落地过程中,训练只是起点,部署才是硬仗。很多开发者训练出精度不错的YOLOv8模型后,一放到生产环境就露馅了——推理速度慢、显存占用高、多路视频流卡顿。PyTorch原生推理虽然方便,但动态图开销大、算子融合不足,在实际业…

2026/7/16 4:33:16 阅读更多 →
Unity游戏模组开发框架BepInEx:从架构解析到Harmony补丁实战

Unity游戏模组开发框架BepInEx:从架构解析到Harmony补丁实战

1. 项目概述:为什么我们需要BepInEx?如果你是一名Unity游戏开发者,或者是一名热衷于为游戏制作模组的爱好者,那么你一定遇到过这样的困境:面对一个心爱的游戏,你有一个绝佳的修改或扩展想法,却发…

2026/7/16 4:31:13 阅读更多 →
C++实时数据流水线设计:7大核心模式与性能优化实战

C++实时数据流水线设计:7大核心模式与性能优化实战

1. 项目概述:从概念到实战的实时数据流水线最近刚参加完2025年的全球C技术大会,回来之后一直想找个时间把会上关于实时数据流水线设计的干货好好梳理一下。这个话题在大会上讨论得特别热烈,几乎每个做高性能计算、金融交易系统或者游戏服务器…

2026/7/16 4:29:09 阅读更多 →
DASCTF X SU 春季挑战赛:逆向工程与流量分析实战复盘

DASCTF X SU 春季挑战赛:逆向工程与流量分析实战复盘

1. 逆向工程实战:从混淆代码到算法还原1.1 RC4算法变形与密钥提取在2024 DASCTF春季赛中,一道逆向题采用了魔改版RC4算法。题目给出的是一个被混淆的Windows PE文件,使用IDA Pro分析时发现核心加密函数存在大量花指令。通过动态调试发现&…

2026/7/16 4:29:09 阅读更多 →
多模态向量检索实战:当CLIP遇上向量数据库,让AI“看懂”图文世界

多模态向量检索实战:当CLIP遇上向量数据库,让AI“看懂”图文世界

文章目录前言一、为什么纯文本检索搞不定“看图”的需求?二、核心模型:CLIP如何打破“次元壁”2.1 CLIP是什么?2.2 多模态检索的三种核心玩法2.3 为什么CLIP特别适合多模态场景?三、技术实现:如何搭建一个“以文搜图”…

2026/7/16 4:25:06 阅读更多 →
ChatGPT Sites:将提示词转化为可共享Web应用的全新解决方案

ChatGPT Sites:将提示词转化为可共享Web应用的全新解决方案

如果你还在为每次使用ChatGPT都要重复输入相似的提示词而烦恼,或者觉得好的提示词难以管理和复用,那么ChatGPT Sites的公测版本可能正是你需要的解决方案。这个平台的核心创新在于将"提示词转应用"的理念落地——让每个精心设计的提示词都能变…

2026/7/16 4:23:05 阅读更多 →

日新闻

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

HarmonyOs应用《重要日》开发第6篇 - 数据持久化存储

本篇深入剖析 ImportantDays 项目的数据持久化方案——基于 HarmonyOS ArkData 模块的 Preferences 轻量级存储,以及 PreferenceUtil 工具类的单例封装。一、HarmonyOS 数据存储方案对比 HarmonyOS 提供了多种数据存储方案:方案适用场景特点Preferences轻…

2026/7/16 0:08:27 阅读更多 →
Python实现跨境电商商品图批量翻译教程

Python实现跨境电商商品图批量翻译教程

一、问题引入做跨境电商的卖家朋友,你是否遇到过这样的困扰?每次上架新品到亚马逊、Shopee或Lazada等平台,都需要处理大量商品图片的多语言版本。比如上架200款衣服,每款需要翻译成英语、日语、韩语等5种语言,这意味着…

2026/7/16 0:08:27 阅读更多 →
鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

鸿蒙 7 新特性实战①:从 0 到 1 掌握 @kit 标准导入规范

从鸿蒙 7(HarmonyOS NEXT)开始,官方全面完成了从 ohos.* 零散模块到 kit.* 领域套件的体系重构。对开发者来说,第一道门槛不是 API 用法变化,而是统一的导入规范——旧体系默认导入、解构导入混用的混乱局面被彻底终结…

2026/7/16 0:10:29 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/15 21:09:01 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/15 19:42:20 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/15 17:52:08 阅读更多 →

月新闻