【学习笔记】网络流
背景
马上ICPC了,很惊奇的发现自己没整理网络流的板子。
最大流 dinic
这里选用的是二分图最大匹配的板子:飞行员配对方案问题
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7,inf=1e18;
struct E
{int to,next,lim;E(){to=next=lim=0;}E(int x,int y,int z):to(x),next(y),lim(z){}
};
vector<E> e;
vector<int> d,ls,cur;
int m,n;
void add(int u,int v,int lim)
{e.push_back(E(v,ls[u],lim));ls[u]=e.size()-1;
}
bool bfs(int S,int T)
{d.assign(n+3,0);d[S]=1;queue<int> q;q.push(S);while(!q.empty()){int u=q.front(); q.pop();for(int i=ls[u]; i; i=e[i].next){int v=e[i].to;if(d[v]>0||e[i].lim==0) continue;d[v]=d[u]+1;if(v==T) return 1;q.push(v);}}return 0;
}
int dfs(int u,int flow)
{if(u==n+2||flow==0) return flow;int res=0;for(int &i=cur[u]; i; i=e[i].next){int v=e[i].to;if(d[u]+1!=d[v]||e[i].lim==0) continue;int f=dfs(v,min(flow-res,e[i].lim));e[i].lim-=f;e[i^1].lim+=f;res+=f;if(flow==res) break;}return res;
}
int dinic(int S,int T)
{int res=0;while(bfs(S,T)){cur=ls;int p=dfs(S,inf);res+=p;}return res;
}
void O_o()
{cin>>m>>n;int S=n+1,T=n+2;
// vector E(n+3,vector<array<int,2>>());e.push_back(E());e.push_back(E());ls.assign(n+3,0);while(1){int x,y;cin>>x>>y;if(x>y) swap(x,y);if(x==-1&&y==-1) break;add(x,y,1);add(y,x,0);}for(int i=1; i<=m; i++){add(S,i,1);add(i,S,0);}for(int i=m+1; i<=n; i++){add(i,T,1);add(T,i,0);}cout<<dinic(S,T)<<"\n";for(int u=m+1; u<=n; u++){for(int i=ls[u]; i; i=e[i].next){int v=e[i].to;if(v<=n&&e[i].lim>0){cout<<v<<" "<<u<<"\n";}}}
}
signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cout<<fixed<<setprecision(12);int T=1;
// cin>>T;while(T--){O_o();}
}
费用流
选用的题目:[NOI2008] 志愿者招募
建边规则:
u − > v : f = f l o w , w = c o s t u->v: f=flow, w=cost u−>v:f=flow,w=cost
v − > u : f = 0 , w = − c o s t v->u: f=0, w=-cost v−>u:f=0,w=−cost
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+7,inf=1e18;
struct E
{int to,next,lim,cost;E(){to=next=lim=cost=0;}E(int a,int b,int c,int d):to(a),next(b),lim(c),cost(d){}
};
vector<E> e(2);
vector<int> ls,dis;
vector<bool> vis;
void add(int u,int v,int c,int w)
{e.push_back(E(v,ls[u],c,w)); ls[u]=e.size()-1;e.push_back(E(u,ls[v],0,-w)); ls[v]=e.size()-1;
}
int n,m,S,T,ans=0;
bool spfa()
{vis.assign(n+4,0);dis.assign(n+4,inf);queue<int> q;q.push(S);vis[S]=1;dis[S]=0;while(!q.empty()){int u=q.front(); q.pop();vis[u]=0;for(int i=ls[u]; i; i=e[i].next){int v=e[i].to;if(e[i].lim==0||dis[v]<=e[i].cost+dis[u]) continue;dis[v]=e[i].cost+dis[u];if(!vis[v]){vis[v]=1;q.push(v);}}}return dis[T]<inf/2;
}
int dfs(int u,int flow)
{vis[u]=1;if(u==T){return flow;}int res=0;for(int i=ls[u]; i; i=e[i].next){int v=e[i].to;if(dis[v]!=dis[u]+e[i].cost||e[i].lim==0||vis[v]) continue;auto p=dfs(v,min(flow,e[i].lim));if(p){e[i].lim-=p;e[i^1].lim+=p;res+=p;ans+=p*e[i].cost;flow-=p;if(!flow) return res;}}return res;
}
int costflow()
{int res=0;while(spfa()){vis[T]=1;while(vis[T]){vis.assign(n+4,0);res+=dfs(S,inf);}}return res;
}void O_o()
{cin>>n>>m;S=n+2; T=n+3;ls.assign(n+4,0); for(int i=1; i<=n; i++){int x;cin>>x;add(i,i+1,inf-x,0);}add(S,1,inf,0);add(n+1,T,inf,0);for(int i=1; i<=m; i++){int l,r,v;cin>>l>>r>>v;r++;add(l,r,inf,v);}costflow();cout<<ans<<"\n";
}
signed main()
{ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);cout<<fixed<<setprecision(12);int T=1;
// cin>>T;while(T--){O_o();}
}
无源汇可行流
本部分参考:https://zhuanlan.zhihu.com/p/324507636
定义:
下界网络:边流量为 l l l 组成的网络。
差网络:边流量为 r − l r-l r−l 组成的网络。

建图过程
- 把差网络的边加入图中,称为非附加边
- 建立超级源 S S SS SS,超级汇 T T TT TT
- 记 d u d_u du 为下界网络中流入的流量 - 流出的流量。
- 如果 d u > 0 d_u > 0 du>0,那么我们从 S S SS SS 向 u u u 连一条流量为 d u d_u du 的边,称为附加边。这样在最终的网络中,去掉附加边后,流出的流量会比流入的多 d u d_u du,平衡了下界网络。
- 同理,如果 d u < 0 d_u < 0 du<0,那么我们从 u u u 向 T T TT TT 连一条流量为 − d u -d_u −du 的边,称为附加边。
- 所有的附加边费用都应该为0
如果跑一遍最大流,附加边的流量没跑满,那么这张图就不存在可行流。
把所有边的流量加上 l l l 就是一个可行流。
有源汇可行流
在无源汇图的基础上,从 T T T 向 S S S 连一条流量上限为 i n f inf inf,费用为 0 0 0 的附加边。注意这是原图的源点和汇点,不是附加的。这样就把问题转换为了无源汇的可行流问题(因为流量平衡了)。可行流的大小等于新加的这条边的流量大小。
有源汇上下界最大流
把图中所有的附加边删掉,根据残余网络从 S S S 到 T T T 跑一遍最大流。这相当于把流量给榨干。再加上可行流就是最大流。

但其实除了 T T T 到 S S S 的那条附加边,其他的边是不用删的,因为他们已经流满了,并且 S S SS SS 和 T T TT TT 的 入度/出度为0,不会对答案产生影响。
有源汇上下界最小流
和最大流类似,从 T T T 到 S S S 跑一遍最大流,用可行流减去最大流即可。这相当于是把不必要的流量还回去。
相关文章:
【学习笔记】网络流
背景 马上ICPC了,很惊奇的发现自己没整理网络流的板子。 最大流 dinic 这里选用的是二分图最大匹配的板子:飞行员配对方案问题 #include<bits/stdc.h> #define int long long using namespace std; const int N1e67,inf1e18; struct E {int to…...
【鸡翅Club】项目启动
一、项目背景 这是一个 C端的社区项目,有博客、交流,面试学习,练题等模块。 项目的背景主要是我们想要通过面试题的分类,难度,打标,来评估员工的技术能力。同时在我们公司招聘季的时候,极大的…...
python+大数据+基于热门视频的数据分析研究【内含源码+文档+部署教程】
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ 🍅由于篇幅限制,想要获取完整文章或者源码,或者代做&am…...
【电子电力】基于PMU相量测量单元的电力系统状态评估
摘要 相量测量单元(PMU)作为一种精确且快速的实时监控设备,在电力系统状态评估中发挥了重要作用。本文研究了在没有PMU和部署PMU情况下,电力系统的电压角度和电压幅值估计误差的差异。通过比较实验结果,发现PMU的应用…...
ubuntu修改默认开机模式(图形/终端)
将 Ubuntu 16 系统设置为开机进入终端模式: 打开终端。编辑 Grub 配置文件:sudo nano /etc/default/grub。找到 GRUB_CMDLINE_LINUX_DEFAULT 行,将其修改为 GRUB_CMDLINE_LINUX_DEFAULT"text"。保存并退出编辑器(Ctrl …...
LaMI-DETR:基于GPT丰富优化的开放词汇目标检测 | ECCV‘24
现有的方法通过利用视觉-语言模型(VLMs)(如CLIP)强大的开放词汇识别能力来增强开放词汇目标检测,然而出现了两个主要挑战:(1)概念表示不足,CLIP文本空间中的类别名称缺乏…...
AI大模型是否有助于攻克重大疾病?
AI大模型在攻克重大疾病方面展现出了巨大的潜力,特别是在疾病预测、药物研发、个性化医疗等领域有着广泛应用。具体来说,AI大模型能够帮助以下几方面: 1、疾病预测与诊断:AI大模型通过分析海量的医学数据,可以提高重大…...
【渗透测试】-红日靶场-获取web服务器权限
拓扑图: 前置环境配置: Win 7 默认密码:hongrisec201 内网ip:192.168.52.143 打开虚拟网络编辑器 添加网络->VMent1->仅主机模式->子网ip:192.168.145.0 添加网卡: 虚拟机->设置-> 添加->网络适配器 保存&a…...
python 深度学习 项目调试 图像分割 segment-anything
起因, 目的: 项目来源: https://github.com/facebookresearch/segment-anything项目目的: 图像分割。 提前图片中的某个目标。facebook 出品, 居然有 47.3k star! 思考一些问题 我可以用这个项目来做什么?给一个图片, 进行分割࿰…...
【GO实战课】第六讲:电子商务网站(6):支付和订单处理
1. 简介 本课程将探讨电子商务网站的支付和订单处理功能,以及使用GO语言实现。在本课程中,我们将介绍如何设计一个可扩展、可靠和高性能的支付和订单处理系统,并演示如何使用GO语言编写相关代码。 本课程的目标是帮助学生理解电子商务网站的支付和订单处理功能,并提供一个…...
专题十三_记忆化搜索_算法专题详细总结
目录 1. 斐波那契数(easy) 那么这里就画出它的决策树 : 解法一:递归暴搜 解法二:记忆化搜索 解法三:动态规划 1.暴力解法(暴搜) 2.对优化解法的优化:把已经计算过的…...
已发布金融国家标准目录(截止2024年3月)
已发布金融国家标准目录2024年3月序号标准编号标准名称...
【论文#快速算法】Fast Intermode Decision in H.264/AVC Video Coding
目录 摘要1.前言2.帧间模式决策概览2.1 H.264/AVC中的帧间模式决策2.2 发现和动机 3.同质性和平稳性的确定3.1 同质性区域的确定3.2 稳定性区域的决定3.3 整体算法 4.实验结果4.1 IPPP序列的测试4.2 IBBP序列测试 5.结论 《Fast Intermode Decision in H.264/AVC Video Coding》…...
Git核心概念图例与最常用内容操作(reset、diff、restore、stash、reflog、cherry-pick)
文章目录 简介前置概念.git目录objects目录refs目录HEAD文件 resetreflog 与 reset --hardrevert(撤销指定提交)stashdiff工作区与暂存区差异暂存区与HEAD差异工作区与HEAD差异其他比较 restore、checkout(代码撤回)merge、rebase、cherry-pick 简介 本文将介绍Git几个核心概念…...
【人工智能在医疗企业个人中的应用】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
IPv4头部和IPv6头部
IPv4和IPv6是互联网协议(IP)中的两个主要版本,它们在数据包头部(Header)结构上存在显著差异。以下是IPv4头部和IPv6头部的主要结构和区别: IPv4头部结构 IPv4(Internet Protocol Version 4&…...
从零开始手把手带你训练LLM保姆级教程,草履虫都能学会!零基础看完这篇就足够了~
导读 ChatGPT面世以来,各种大模型相继出现。那么大模型到底是如何训练的呢,在这篇文章中,我们将尽可能详细地梳理一个完整的 LLM 训练流程,包括模型预训练(Pretrain)、Tokenizer 训练、指令微调࿰…...
strcat函数追加字符串
char * strcat ( char * destination, const char * source ); dest:目标字符串,即要将源字符串追加到其末尾的字符串。src:源字符串,即要追加到目标字符串末尾的字符串 使用strcat函数给目标字符串追加字符时,首先要…...
每月洞察:App Store 和 Google Play 的主要更新
Google Play 和 App Store 的算法不断发展,定期更新和变化会显着影响其功能。对于开发人员和营销人员来说,跟上这些变化至关重要,因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新,解释它…...
【python openai function2json小工具】
两种方法 一种openai-swarm中提供的、一种langchain实现的 一、openai工具函数调用 import inspectdef merge_chunk(final_response: dict, delta: dict) -> None:delta.pop("role", None)merge_fields(final_response, delta)tool_calls delta.get("tool_…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
AI书签管理工具开发全记录(十九):嵌入资源处理
1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
深入浅出Diffusion模型:从原理到实践的全方位教程
I. 引言:生成式AI的黎明 – Diffusion模型是什么? 近年来,生成式人工智能(Generative AI)领域取得了爆炸性的进展,模型能够根据简单的文本提示创作出逼真的图像、连贯的文本,乃至更多令人惊叹的…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现指南针功能
指南针功能是许多位置服务应用的基础功能之一。下面我将详细介绍如何在HarmonyOS 5中使用DevEco Studio实现指南针功能。 1. 开发环境准备 确保已安装DevEco Studio 3.1或更高版本确保项目使用的是HarmonyOS 5.0 SDK在项目的module.json5中配置必要的权限 2. 权限配置 在mo…...
