首页 > 其他分享 >网络流

网络流

时间:2023-07-20 20:11:56浏览次数:31  
标签:增广 残量 网络 流量 算法 2i

网络

网络和网络流是不一样的。(废话,毕竟他俩差一个字)

网络是指一个有向图 \(G = (V, E)\),每条边 \((u, v) \in E\) 都有一个权值 \(c(u, v)\),我们把它叫做这条边的容量。

显然,当 \((u, v) \notin E\) 时,\(c(u, v) = 0\)。

其中有 \(2\) 个特殊的点:源点 \(s\) 和汇点 \(t\),\(s,t \in V\) 且 \(s \not= t\)。

我们设 \(f(u, v)\) 为定义在二元组 \((u \in V, v \in V)\) 上的实数函数,则当它满足以下 \(3\) 个条件时就被称为网络 \(G\) 的流函数。

  • 容量限制:对于每条边,流量不超过容量,即 \(f(u, v) \le c(u, v)\)。

  • 斜对称性:每条边的流量与其相反边的流量互为相反数,即 \(f(u, v) = -f(v, u)\)。

  • 流守恒性:流出源点的流量一定等于流入汇点的流量,即 \(\forall x \not= s, x \not= t,\sum_{(u, x) \in E} f(u, x) = \sum_{(x, v) \in E} f(x, v)\)。

这个时候对于 \((u, v) \in E\),我们称 \(f(u, v)\),为边的流量,\(c(u, v) - f(u, v)\) 为边的剩余容量。整个网络的流量为 \(\sum_{(s, v) \in E} f(s, v)\) 。

常见问题

一般使用网络流解决最大流,最小割,费用流,上下界网络流 \(4\) 种。

最大流

显然,对于一个网络 \(G\),合法的流函数有很多很多。所以我们要去求它的最值,最小值肯定是 \(0\),而最大值则是我们接下来要详细讲的最大流。

使 \(\sum_{(s, x) \in E} f(s, x)\) 最大的流函数被称为网络的最大流,此时流量被称为网络的最大流。

FF(Ford-Fulkerson)

这个算法运用贪心的方法,通过不断在残量网络中寻找增广路实现。

增广路就是指在残量网络中存在一条路径 \(P\)(\(P\) 为边集),使 \(\forall (u, v) \in P, r(u, v) > 0\) (\(r(u, v) = c(u, v) - f(u, v)\),为剩余容量)。

注:只要残量网络中还存在增广路,说明一定还有一些流量可以从源点流到汇点,故此时还没有找到最大流。

而这个算法正是通过 dfs 寻找当前残量网络中的增广路,此增广路的流为 \(min(r(u, v))\)。

注:这里一定是最小,因为如果流量大于最小剩余容量的话就一定存在至少一条边无法正常流过。

找到一条增广路增加答案后,就对增广路上的每一条边和每一条反向边进行修改。

假设此增广路流为 \(flow\),若 \((u, v) \in P\),\(r'(u, v) = r(u, v) - flow\),根据斜对称性:\(r'(v, u) = r(v, u) + flow\)。

修改反向边是必不可少的,因为我们不能保证当前增广路都是最优的。如果不进行此操作,可能会导致接下来源点与汇点不再联通,但实际上如果当前增广路换一种可以避免这个问题。

直到残量网络中 \(s\) 与 \(t\) 不在联通时,算法结束,得到最大流。

注意:用链式前向星存图 \(tot\) 必须从 \(1\) 开始(即第一条边编号为 \(2\)),因为更新反边是通过 \(i \oplus 1\),第输入的第 \(i\) 条边编号为 \(2i - 1\),反向边 \(2i\),但 \((2i - 1) \oplus 1 = 2i- 2\),而不是 \(2i\),这样就会导致错误。

code
struct node {
   int n, m, head[N], tot, flow;
   bool vis[N];
   Edge edge[M << 1];
   inline node() { tot = 1; }
   inline void add(int u, int v, int c) {
     edge[++tot].c = c, edge[tot].to = v;
     edge[tot].next = head[u], head[u] = tot;
   }
   inline int dfs(int u, int flow, int t) {
   	if (u == t)
   		return flow;
   	vis[u] = true;
   	for (int i = head[u]; i; i = edge[i].next) {
   		int v = edge[i].to, c = edge[i].c, flo;
   		if (c && !vis[v]) //如果当前边还可以继续流并且还没有流过当前点 
   			if (~(flo = dfs(v, min(flow, c), t))) {	//求出流,如果不是-1代表找到增广路 
   				edge[i].c -= flo, edge[i ^ 1].c += flo;	//修改增广路上每一条边及其反向边 
   				return flo;
   			}
   	}
   	vis[u] = false;	//回溯 
   	return -1;
   } 
   inline void FF(int s, int t) {
   	flow = 0;
   	int f;
   	while (~(f = dfs(s, inf, t))) {	//寻找增广路 
   		flow += f; //将答案加上当前增广路的流 
   		for (int i = 1; i <= n; i++)
   			vis[i] = false;
   	}
   }
} F;

时间复杂度:\(O(nm^2)\)。

EK(Edmonds–Karp)

其实就是对 FF 优化了一下。

可以看到,FF 使用 dfs 寻找增广路,如果到达 \(t\) 说明找到一条增广路,并在回溯的时候修改每条增广路上边以及对应反向边的剩余容量。

但 dfs 的复杂度很高,所以 FF 算法非常容易超时,我们考虑优化一下。

而 EK 算法就是将 FF 算法的 dfs 改为 bfs 寻找增广路,这样降低了程序的时间复杂度。

整个算法实现过程如下:

  • 若从 \(s\) 找到了一条到 \(t\) 的增广路,就说明还可以继续更新答案。

  • 对于增广路上每一个点(除 \(s\) 外),用 \(pre_i\) 记录从编号为 \(pre_i\) 的边到达 \(i\) 这个点。

  • 修改每条增广路上的边及其反向边的剩余容量。

  • 重复以上过程直到 \(s\) 与 \(t\) 不连通。

注:\(tot\) 仍要从 \(1\) 开始。

标签:增广,残量,网络,流量,算法,2i
From: https://www.cnblogs.com/-I-AK-IOI-/p/17569541.html

相关文章

  • 【网络流,dp】Gym102220A Apple Business
    ProblemLink有一棵\(n\)个点的完全二叉树(点\(i\)的父亲是\(\lfloori/2\rfloor\)),第\(i\)个点有\(a_i\)个苹果。现在有\(m\)个订单,每个订单只接受\(u_i\)到\(v_i\)路径上的苹果,保证\(u_i\)是\(v_i\)的父亲,并且最多只接受\(c_i\)个苹果,单价为\(w_i\)。你可......
  • OpenStack 网络 不通 根据
    OpenStack网络不通根据介绍OpenStack是一个开源的云计算平台,它提供了一套完整的解决方案来构建和管理私有云和公有云环境。在OpenStack中,网络是一个重要的组件,它允许虚拟机之间进行通信,并提供了对外部网络的连接。然而,有时候我们可能会遇到网络不通的问题,这篇文章将带你了解一些......
  • MATLAB train 神经网络 函数
    MATLABtrain神经网络函数神经网络是一种用于模拟人脑神经系统的数学模型,它由大量的神经元和连接它们的权重组成。MATLAB是一个功能强大的数学计算软件,提供了丰富的工具箱和函数,用于神经网络的设计和训练。其中train函数是MATLAB中用于训练神经网络的重要函数之一。train函数的......
  • U-Net神经网络总体结构
    实现U-Net神经网络总体结构1.简介U-Net是一种用于图像分割的神经网络结构,在医学领域的图像分析中得到广泛应用。它的结构独特,可以实现高精度的图像分割任务。本文将介绍U-Net的总体结构以及每一步的代码实现。2.U-Net总体结构U-Net的总体结构可以分为两个部分:编码器(En......
  • 小分支职场网络覆盖案例总结
    需求描述1.AP部分: AP数量较少,考虑到成本,AP使用FAT模式。2.交换机部分:下联接入有线网部分和AP部分。3.防火墙部分:网关、DHCP、NAT具体配置1.AP部分====修改AP工作模式====****查看AP工作模式****[CN-SZBW-1F-OFFICE-AP11]displaywlandeviceroleCurrentrunningmo......
  • 脉冲神经网络理论基础(1)
    神经元的基本结构(高中生物x)图源wiki。接收区(receptivezone):为树突(dendrite)到胞体(soma)的部分。在计算建模时,往往把树突作为接受区看待。树突接受突触前神经元的信号,在ANN结构中表现为当前神经元接受前一层的输入,并以突触的权重进行加权和。触发区(triggerzone):为细胞体与轴突交......
  • 卷积神经网络
    ConvolutionalNeuralNetwork(CNN卷积神经网络)解释一应用于Imageclassification(图像分类)一张图片如何作为一个模型的输入:一张图片可以当成三维的Tensor(维度大于等于2的矩阵),三维分别代表图片:宽、高、channels(宽高代表像素,channels代表RGB三色) 参数过多,模型弹......
  • 网络编程 p5 UDP编程
    UDP网络通信编程基本介绍类DatagramSocket和DatagramPacket实现了基于UDP协议网络程序。UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。DatagramPacket对象封装了UDP数据报,在数据报中包含了发......
  • 搬运 -阮一峰的网络日志 --Flex 布局教程:实例篇
    原文链接:http://www.ruanyifeng.com/blog/2015/07/flex-examples.html语法: https://www.cnblogs.com/yuwen1995/p/17568483.html一、骰子的布局骰子的一面,最多可以放置9个点。下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到codepen查看Demo。如果不加说明,本节的......
  • 230712 // 新知:网络流
    今天是弟弟的10岁生日,祝他以后不要成为一个臭学信息的。Cindy,玩原玩的。我忘了叫什么什么酩,不玩原导致的。概念认知所谓咕咕咕……A.草地排水http://222.180.160.110:1024/contest/3696/problem/1B.完美的牛栏ThePerfectStallhttp://222.180.160.110:1024/co......