首页 > 其他分享 >网络流

网络流

时间:2024-10-18 18:58:48浏览次数:1  
标签:增广 dep ll 网络 dfs 层数 流量

  • 网络流是求网络最大流的算法,看似没什么用,实际上很多题目都可以通过建图转化为网络最大流问题

P3376 【模板】网络最大流

概念

  • “网络最大流问题”本身是指从一个原点 \(s\) 往外流水,这个原点本身有无穷多水可以流,有 \(m\) 根双向管道连接 \(n\) 个节点,每个节点都有一个最大流量,指的是这根水管最大可以承载的水流量。有一个汇点 \(t\),问从原点向汇点流水的最大流量。

反向边

  • 容易想到,如果现在图上还有路可以走,即还有一条路可以让水流到\(t\),我们将这种路称为增广路。那么将这条增广路流了一定不亏。
  • 但这样并不能保证最优,那么通过什么方法来保证我流了这条路后面还有办法反悔呢?
  • 这里有一种非常巧妙的方法。为每一条边建一条权值为零的反边。如果我们发现某条路不优,那么就可以流回去(毕竟流量可以随意分配)。
  • 我们对于这种路并不需要特殊处理,就像dfs的回溯一样,是对最优解的自发寻找。只需要每次流过一条边时,使其反边的流量加上这次的流量(因为正边会减少这次的流量)。
    初始状态
  • 假设这是初始的状态
    第一次dfs
  • 假设经过了一次增广(就是把某条增广路走满)后的图是这样的(这里的蓝色值是反边的流量)
  • 这里如果没有反向边,那么程序就已经结束了(因为找不出增广路了)。但显然这并不是最优解。因此反向边的作用就凸显出来了
    第二次dfs
  • 在有反向边的情况下,显然还有一条绿色的增广路。这时才真正意义上找到了最优解。观察最终状态,发现中间那条路实际上是没走的。因此,反边的作用就是对可能不优的方案进行“反悔”操作。

dinic算法

  • 综上,我们具体需要解决两个问题:
    1.找到是否有增广路
    2.对增广路进行修改并统计答案
  • 对于是否有增广路的问题,可以直接用bfs来寻找。
  • 但是,在bfs的过程中,我们还需要建立分层图,即给每个点维护其到 \(s\) 的最小边数。这里,还是以上图为例,给上图标上层数
    初始分层图
  • 为什么要标上层数呢?因为如果我们发现原图有增广路,那么就可以 从 \(s\) 开始dfs,依次算增广路。这里的图不是很好,如果有一个点最大流量比较大,那其就可以给很多与其相连的边分流量。如果没标层数,那这个边与其反边就可能反复互相流,造成极大的时间浪费。如果我们按照层数一层一层流,就可以保证每次都能靠近 \(t\)。同时,由于层数的限制,我们可以一次增广多条增广路。
  • 但是,这里还是有些问题。相邻两个点 \(u、v\) 间的层数差并不是1,就可能造成无法增广的情况。
  • 事实上,这种情况是没有影响的。由于每次增广完后都会重新bfs,重新计算层数,因此上述情况证明 \(u\) 到 \(v\) 这条路并不是到 \(t\) 的最短路,就算这条路会在最终的答案中,也会在 \(u\) 多次被增广后与 \(v\) 层数相差一,即 \(u、v\) 两个点在到 \(t\) 的同一条相对短的路径上。

当前弧优化

  • 这个算是比较好理解的一条优化。在同一次dfs中,对于其枚举的前几条边,其到 \(t\) 的路径一定是被流满了的。如果再次dfs到这个点,那就不用考虑这前几个已经被流满了的点了。

几个小细节

  1. 由于对于流了的每条边,我们都要对其反边加上其流量,因此这里考虑用链式前向星,点的编号从1开始,在加边的时候正反边一起相邻加,对于某边的反边,其编号就是边的编号异或1。
  2. 在dfs时,如果某个点无法流到 \(t\),即流量为0,就将其层数设为 \(inf\),让其不再被更新(注意改层数只是对于这一次dfs而言,对下一次没有影响)
  3. 注意每次bfs时将当前弧优化的数组以及层数初始化回去
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=5e5+10;
const ll inf=1e18+10;
ll n,m,s,t,head[N],tot=1,dep[N],now[N],ans=0;
//now->当前弧优化数组 tot从1开始 
struct node
{
	ll nxt,to;
	ll val;
}e[N];

void add(ll u,ll v,ll w)
{
	e[++tot].nxt=head[u];
	head[u]=tot;
	e[tot].to=v;
	e[tot].val=w;
}

bool bfs()
{
	for(ll i=1;i<=n;i++) dep[i]=inf;//记得初始化 
	queue <ll> q;
	q.push(s);dep[s]=1;
	now[s]=head[s];                //同样得初始化 
	while(!q.empty())//广搜 
	{
		ll u=q.front();q.pop();
		for(ll i=head[u];i;i=e[i].nxt)
		{
			ll v=e[i].to;
			if(e[i].val&&dep[v]==inf)
			{
				q.push(v);
				now[v]=head[v];
				dep[v]=dep[u]+1;
				if(v==t) return 1;
			}
		}
	}
	return 0;
}

ll dfs(ll u,ll sum)
{
	if(u==t) return sum;
	ll k=0,res=0;
	for(ll i=now[u];i;i=e[i].nxt)
	{
		now[u]=i;
		ll v=e[i].to;
		if(e[i].val&&dep[v]==dep[u]+1)
		{
			k=dfs(v,min(sum,e[i].val));//尽可能流最大流量 
			if(k==0) dep[v]=inf;       //流不到汇点 
			e[i].val-=k;e[i^1].val+=k;//其反边加 
			res+=k,sum-=k;
			if(!sum) break;
		}
	}
	return res;
}

int main()
{
	cin>>n>>m>>s>>t;
	for(int i=1,u,v,w;i<=m;i++)
	{
		cin>>u>>v>>w;
		add(u,v,w);add(v,u,0);//建权值为0的反向边 
	}
	while(bfs())
	{
		ans+=dfs(s,inf);//不断找增广路 
	}
	cout<<ans<<endl;
}

标签:增广,dep,ll,网络,dfs,层数,流量
From: https://www.cnblogs.com/allforgod/p/18474523

相关文章

  • 20222424 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    202224242024-2025-1《网络与系统攻防技术》实验二实验报告1.实验内容使用netcat获取主机操作Shell,cron启动某项任务使用socat获取主机操作Shell,任务计划启动使用MSFmeterpreter(或其他软件)生成可执行文件(后门),利用ncat或socat传送到主机并运行获取主机Shell使用MSFmete......
  • 网络常用工具
    软件工具puttySecureCRTCMD华为模拟器-enspwindwos常用命令pingtracertnslookupipconfigtelnet硬件工具Console线网络钳寻线仪红光笔光功率计故障处理常用方法对比分析互换分析仪表测试分段处理常见故障私接路由排查通过arp-a获取mac地址,再通过交......
  • Piper: 快速、本地化的神经网络文本转语音系统
    Piper简介Piper是一个快速、本地化的神经网络文本转语音(TTS)系统,专为树莓派4优化设计,但也可在其他平台上运行。它提供高质量的语音合成,支持多种语言和声音,适用于各种项目和应用场景。PiperlogoPiper的主要特点包括:快速高效:针对树莓派4等设备进行了优化本地运行:无需......
  • 20222408 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    1.实验内容1.1本周学习内容本次实验中,学习的重点是后门的实现与启动方式,学习内容还有后门的定义、原理以及可能影响,netcat、socat、MSFmeterpreter软件的应用。1.2实验内容简述使用netcat获取主机操作Shell,利用cron启动一项任务使用socat获取主机操作Shell,利用创建任务计......
  • 快快网络DDoS安全防护系统抵御了创纪录的 2.35 Tbps DDoS 攻击
    在网络安全领域,分布式拒绝服务(DDoS)攻击因其巨大的破坏力和难以防范的特性,一直是网络攻防斗争的焦点。近日,快快网络宣布,其自研的DDoS安全防护产品成功抵御了一次创纪录的2.35TbpsDDoS攻击,这是迄今为止国内监测到的最大规模的攻击。快快网络DDoS团队的数据显示,此次T级DDoS攻击......
  • 网络安全--信息收集
    学习视频来自B站UP主泷羽sec,如涉及侵权马上删除文章。笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。补天漏洞响应平台补天-企业和白帽子共赢的漏洞响应平台,帮助企业建立SRC子域名域名下可能存在多个子域名地......
  • 基于网络爬虫技术的中国电动汽车市场分析与可视化系统 毕业设计-附源码02721
    摘要中国电动汽车市场快速发展,政策支持和环保意识提升推动了电动汽车需求增长。基于网络爬虫技术的中国电动汽车市场分析与可视化系统旨在提供全面的电动汽车市场数据分析和直观的可视化展示。系统利用Python进行数据处理和分析,Django构建后端框架,Vue实现前端交互,实现数据的......
  • 基于卷积神经网络的乳腺癌细胞识别系统,resnet50,mobilenet模型【pytorch框架+python源
     更多目标检测和图像分类识别项目可看我主页其他文章功能演示:卷积神经网络,乳腺癌细胞识别系统,resnet50,mobilenet【pytorch框架,python】_哔哩哔哩_bilibili(一)简介基于卷积神经网络的乳腺癌细胞识别系统是在pytorch框架下实现的,这是一个完整的项目,包括代码,数据集,训练好的模......
  • ArkWeb网络安全基础 - 跨域请求与解决方案
    本文旨在深入探讨华为鸿蒙HarmonyOSNext系统(截止目前API12)的技术细节,基于实际开发实践进行总结。主要作为技术分享与交流载体,难免错漏,欢迎各位同仁提出宝贵意见和问题,以便共同进步。本文为原创内容,任何形式的转载必须注明出处及原作者。简介华为鸿蒙HarmonyOSNext系统的Ar......
  • 20222427 2024-2025-1 《网络与系统攻防技术》实验二实验报告
    1.实验内容1.1本周学习内容更加深入地学习了缓冲区溢出的相关知识。学习了关于ncat,socat等工具的原理,并尝试使用。初步学习了关于后门的基础知识。1.2实践目标(1)使用netcat获取主机操作Shell,cron启动某项任务(任务自定)PS:cron是linux下用来周期性的执行某种任务或......