当前位置: 首页 > news >正文

【学习笔记】网络流

背景

马上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 rl 组成的网络。
在这里插入图片描述

建图过程

  1. 把差网络的边加入图中,称为非附加边
  2. 建立超级源 S S SS SS,超级汇 T T TT TT
  3. d u d_u du 为下界网络中流入的流量 - 流出的流量
  4. 如果 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,平衡了下界网络。
  5. 同理,如果 d u < 0 d_u < 0 du<0,那么我们从 u u u T T TT TT 连一条流量为 − d u -d_u du 的边,称为附加边
  6. 所有的附加边费用都应该为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了&#xff0c;很惊奇的发现自己没整理网络流的板子。 最大流 dinic 这里选用的是二分图最大匹配的板子&#xff1a;飞行员配对方案问题 #include<bits/stdc.h> #define int long long using namespace std; const int N1e67,inf1e18; struct E {int to…...

【鸡翅Club】项目启动

一、项目背景 这是一个 C端的社区项目&#xff0c;有博客、交流&#xff0c;面试学习&#xff0c;练题等模块。 项目的背景主要是我们想要通过面试题的分类&#xff0c;难度&#xff0c;打标&#xff0c;来评估员工的技术能力。同时在我们公司招聘季的时候&#xff0c;极大的…...

python+大数据+基于热门视频的数据分析研究【内含源码+文档+部署教程】

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ &#x1f345;由于篇幅限制&#xff0c;想要获取完整文章或者源码&#xff0c;或者代做&am…...

【电子电力】基于PMU相量测量单元的电力系统状态评估

摘要 相量测量单元&#xff08;PMU&#xff09;作为一种精确且快速的实时监控设备&#xff0c;在电力系统状态评估中发挥了重要作用。本文研究了在没有PMU和部署PMU情况下&#xff0c;电力系统的电压角度和电压幅值估计误差的差异。通过比较实验结果&#xff0c;发现PMU的应用…...

ubuntu修改默认开机模式(图形/终端)

将 Ubuntu 16 系统设置为开机进入终端模式&#xff1a; 打开终端。编辑 Grub 配置文件&#xff1a;sudo nano /etc/default/grub。找到 GRUB_CMDLINE_LINUX_DEFAULT 行&#xff0c;将其修改为 GRUB_CMDLINE_LINUX_DEFAULT"text"。保存并退出编辑器&#xff08;Ctrl …...

LaMI-DETR:基于GPT丰富优化的开放词汇目标检测 | ECCV‘24

现有的方法通过利用视觉-语言模型&#xff08;VLMs&#xff09;&#xff08;如CLIP&#xff09;强大的开放词汇识别能力来增强开放词汇目标检测&#xff0c;然而出现了两个主要挑战&#xff1a;&#xff08;1&#xff09;概念表示不足&#xff0c;CLIP文本空间中的类别名称缺乏…...

AI大模型是否有助于攻克重大疾病?

AI大模型在攻克重大疾病方面展现出了巨大的潜力&#xff0c;特别是在疾病预测、药物研发、个性化医疗等领域有着广泛应用。具体来说&#xff0c;AI大模型能够帮助以下几方面&#xff1a; 1、疾病预测与诊断&#xff1a;AI大模型通过分析海量的医学数据&#xff0c;可以提高重大…...

【渗透测试】-红日靶场-获取web服务器权限

拓扑图&#xff1a; 前置环境配置&#xff1a; Win 7 默认密码&#xff1a;hongrisec201 内网ip:192.168.52.143 打开虚拟网络编辑器 添加网络->VMent1->仅主机模式->子网ip:192.168.145.0 添加网卡&#xff1a; 虚拟机->设置-> 添加->网络适配器 保存&a…...

python 深度学习 项目调试 图像分割 segment-anything

起因&#xff0c; 目的: 项目来源: https://github.com/facebookresearch/segment-anything项目目的: 图像分割。 提前图片中的某个目标。facebook 出品&#xff0c; 居然有 47.3k star! 思考一些问题 我可以用这个项目来做什么?给一个图片&#xff0c; 进行分割&#xff0…...

【GO实战课】第六讲:电子商务网站(6):支付和订单处理

1. 简介 本课程将探讨电子商务网站的支付和订单处理功能,以及使用GO语言实现。在本课程中,我们将介绍如何设计一个可扩展、可靠和高性能的支付和订单处理系统,并演示如何使用GO语言编写相关代码。 本课程的目标是帮助学生理解电子商务网站的支付和订单处理功能,并提供一个…...

专题十三_记忆化搜索_算法专题详细总结

目录 1. 斐波那契数&#xff08;easy&#xff09; 那么这里就画出它的决策树 &#xff1a; 解法一&#xff1a;递归暴搜 解法二&#xff1a;记忆化搜索 解法三&#xff1a;动态规划 1.暴力解法&#xff08;暴搜&#xff09; 2.对优化解法的优化&#xff1a;把已经计算过的…...

已发布金融国家标准目录(截止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几个核心概念…...

【人工智能在医疗企业个人中的应用】

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

IPv4头部和IPv6头部

IPv4和IPv6是互联网协议&#xff08;IP&#xff09;中的两个主要版本&#xff0c;它们在数据包头部&#xff08;Header&#xff09;结构上存在显著差异。以下是IPv4头部和IPv6头部的主要结构和区别&#xff1a; IPv4头部结构 IPv4&#xff08;Internet Protocol Version 4&…...

从零开始手把手带你训练LLM保姆级教程,草履虫都能学会!零基础看完这篇就足够了~

导读 ChatGPT面世以来&#xff0c;各种大模型相继出现。那么大模型到底是如何训练的呢&#xff0c;在这篇文章中&#xff0c;我们将尽可能详细地梳理一个完整的 LLM 训练流程&#xff0c;包括模型预训练&#xff08;Pretrain&#xff09;、Tokenizer 训练、指令微调&#xff0…...

strcat函数追加字符串

char * strcat ( char * destination, const char * source ); dest&#xff1a;目标字符串&#xff0c;即要将源字符串追加到其末尾的字符串。src&#xff1a;源字符串&#xff0c;即要追加到目标字符串末尾的字符串 使用strcat函数给目标字符串追加字符时&#xff0c;首先要…...

每月洞察:App Store 和 Google Play 的主要更新

Google Play 和 App Store 的算法不断发展&#xff0c;定期更新和变化会显着影响其功能。对于开发人员和营销人员来说&#xff0c;跟上这些变化至关重要&#xff0c;因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新&#xff0c;解释它…...

【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_…...

基于Simulink的自抗扰控制(ADRC)在OBC前级的应用

手把手教你学Simulink——基于Simulink的自抗扰控制(ADRC)在OBC前级的应用​ (附:OBC前级拓扑剖析+ADRC抗扰原理+TD/ESO/NLSEF算法推导+Simulink全模型搭建+动态响应/谐波抑制对比+实机部署指南) 摘要​ 车载充电机(OBC)前级作为交流-直流(AC-DC)整流核心,需将电网…...

教育资源解析工具:打通国家中小学智慧教育平台电子课本获取通道

教育资源解析工具&#xff1a;打通国家中小学智慧教育平台电子课本获取通道 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具&#xff0c;帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载&#xff0c;让您更方便地获取课本内容。 …...

牙齿龋齿检测数据集 YOLO模型如何训练牙齿病害数据集 权重识别龋齿

牙齿龋齿检测数据集&#xff0c;2554张&#xff0c;提供yolo和voc两种标注方式 1类&#xff0c;标注数量&#xff1a; caries: 6946 image num: 2554 &#x1f9b7; 龋齿检测数据集 (Dental Caries Detection Dataset) 属性详细描述数据集名称齿科龋齿目标检测数据集图像总数2…...

别再只盯着Node2vec了!2024年链路预测实战:从传统打分到GNN端到端,一篇搞定

链路预测技术全景&#xff1a;从传统启发式到GNN端到端的实战演进 社交网络的好友推荐、电商平台的"猜你喜欢"、学术论文的引用预测——这些场景背后都依赖链路预测技术。作为图数据挖掘的核心任务之一&#xff0c;链路预测通过分析节点间潜在连接关系&#xff0c;为…...

COMSOL数据可视化避坑指南:如何用SciPy的griddata处理不规则网格数据?

COMSOL数据可视化避坑指南&#xff1a;如何用SciPy的griddata处理不规则网格数据&#xff1f; 当你从COMSOL导出电场、温度场或其他物理场数据时&#xff0c;是否遇到过这样的困扰&#xff1a;明明在COMSOL中看起来光滑连续的场分布&#xff0c;导出到MATLAB或Python中绘制时却…...

SparseMoE实战:从零构建一个高效的稀疏混合专家层

1. 稀疏混合专家层&#xff08;SparseMoE&#xff09;入门指南 第一次听说稀疏混合专家层时&#xff0c;我也是一头雾水。这玩意儿听起来像是某种高科技黑箱&#xff0c;但实际上它的核心思想特别接地气——就像我们去医院看病&#xff0c;普通全科医生能处理常见病症&#xff…...

用51单片机+Proteus仿真,从零到一复刻一个数码管电子钟(附完整代码和电路图)

从零构建51单片机数码管电子钟&#xff1a;Proteus仿真与实战全解析 数码管电子钟作为单片机入门经典项目&#xff0c;能系统训练定时器、中断、数码管驱动等核心技能。但很多初学者在独立实现时&#xff0c;常遇到仿真效果不稳定、显示闪烁或计时不准等问题。本文将用保姆级教…...

视频画面匹配软件 影视片段匹配软件出售 创作效率提升 速橙软件-相同视频片段匹配系统

免费下载链接&#xff1a;http://www.suchengai.cn/作为一名视频创作者或影视解说博主&#xff0c;你是否经常面临这样的困境&#xff1f;为了制作一个10分钟的视频解说&#xff0c;需要花费数小时甚至一整天的时间&#xff0c;在原始影片中手动查找和剪辑对应的片段。这不仅效…...

UE5新手避坑:用C++实现关卡切换和字符串处理,别再复制粘贴了

UE5 C实战避坑指南&#xff1a;关卡切换与字符串处理的高效实践 刚接触UE5 C开发的程序员们&#xff0c;是否经常遇到关卡切换不生效、字符串比较结果诡异、GetAllActorsOfClass导致性能骤降等问题&#xff1f;本文将深入剖析这些典型陷阱&#xff0c;带你从底层机制理解正确做…...

Ascend CANN平台避坑指南:从算子开发到模型部署的5个关键陷阱

Ascend CANN平台避坑指南&#xff1a;从算子开发到模型部署的5个关键陷阱 在AI加速器领域&#xff0c;昇腾NPU凭借其独特的达芬奇架构和CANN软件栈&#xff0c;正在成为越来越多企业级AI部署的首选方案。然而在实际工程落地过程中&#xff0c;从算子开发到模型部署的完整链路里…...