网络流 (一) 最大流的原理图解

嗯…于是学一波网络流罢
之前学过一波,不过失败了orz
希望这次能学成功(x)


建模

想象一下,你在调度货车运输(不是最小生成树+LCA那道题放心吧),但是有些桥是有载重限制的。比如下图:

绿色的边表示桥,上面的数字表示载重。
老板打算从A到G。
显然,作为一个老板,超载是不合适的,姑且不论货物安全,还有可能受到法律惩罚!那么,最多能一次载多少货物呢?

在解决这个问题之前,我们先为这一模型定义一些概念。
出发点成为源点,也就是 A ,显然,该点入度为0
终点称为汇点,也就是 G ,显然,该点出度为0
而每条边上的最大载重称为容量,例如 CD 边的容量是6。引入符号 c[i,j] 表示从节点 i 到节点j的容量;在实际问题中,一条边不一定必须达到载重,一个载重6t的路放4t的货车运输,那么我们就称4是这条路的流量。引入符号 f[i,j] 表示节点 i 到节点j的容量。
显然,由于不可能超过限重, f[i,j]<=c[i,j] 恒成立。
并且,货物显然不能损失吧,所以源点和汇点的流量是相同的,对于所有点,流入的流量和流出是相同的。

建模完成,接下来就是求解了。


增广

首先,我们定义一种合理的载重方法为可行流。比如下图:

黄色的代表一个可行流,其中数字第一个表示容量,第二个为流量。
我们知道,零流就是一个典型代表——毕竟,它并不会超过容量。

然后,我们就可以开始增广操作了。其实增广是一种自然而然的想法:假定路径 s 是当前的流,并且,这条路径还可以拓展,那么我们就试图去塞进去更多的流。
这样说不是很明白,举个栗子(为了方便我画图起见我们姑且换一个图)来演示一下过程好了。

好的,现在先yy一下图中存在0流。这里我们写了一个东西叫做剩余,表示的是当前这中方式下还有多少流能够汇入。
那么,增广开始。不妨采用BFS的思想,第一次找到了路径ABC
我们发现,这条路线上最多能增广2单位的流,所以我们将流注入。

图中的 n/m 表示 /
此时变成了这种样子。然后我们仍然BFS,发现了 ABDC 这条路径。这条路径上最多能增广一个单位的流,于是增长之。

没毛病!然后再去增广 ADC 这条路,结果发现,可以增长三个单位的流。增长之:

扫视一遍,发现未有能增广者,结束增广。
完成了,可喜可贺。由于源点和汇点的流量相同,我们知道,最大流就是6个单位。为之四顾,为之踌躇满志。
但是,在你跃跃欲试去写网络流模板之前,不得不先泼一瓢凉水——
如果此时BFS没有去增广 ABC ,而是先增广了 ABDC 呢?这个时候,我们再来看看情况:

(上面的 CD 应该剩余1,写错了)
继续:

惊悚的事情发生了。
没错,之后没有办法增广了,但是!此时我们求出的最大流是4!

这是否证明我们的贪心思路是错的呢?
机制的珂学家们引入了下面的概念,完美的回避掉了这个致命的漏洞——


反向弧

既然这么贪不一定是对的,那么我们就可以引入一种后悔机制,来提供反悔的机会。
怎么搞呢?我们可以每增广一次,就建立一条反向边。
仍然是上面的例子,在对 ABCD 增广之后如下图。

注意,这里的 ABCD 并不是虚点,而是 ABCD 本身,这里只是为了方便画图和观察所以分开画了。
然后呢——我们发现, ADBC 变得可增广了,也就是, AD,DB,BC 这条。那么我们对它进行增广之后:

这个图可能稍微有些乱,红色的是我们增广的东西,绿色是增广建的反向边。
当然,继续扫一遍,发现 ADC 还可以增广,于是最后的结果:

没有可以增广的了——完成DAZE!
所以最终的结果就是6。
那么可能有人会问了——上面我们走了 ADBC 这条原本不应该存在的路,意义是什么呢?其实,这相当我们把原本贪心走 BD 这条路的流逼了回去,转而走 BC

上面就是一切网络流问题的基础,也是最大流的原理。下一篇文章,我们考虑其实现办法。


参考Blog

https://www.cnblogs.com/ZJUT-jiangnan/p/3632525.html
http://blog.csdn.net/xiaoxin_ling/article/details/19970179

### 卷积神经网络 (Convolutional Neural Network, CNN) 的工作原理 卷积神经网络种专门用于处理具有网格状拓扑结构数据的深度学习模型,最常应用于图像分类、目标检测等领域。其核心思想在于通过局部感知和权值共享来提取空间层次特征。 #### 局部感知与权值共享 CNN 中的核心操作是 **卷积运算**,它利用个小尺寸的滤波器(称为卷积核或 kernel),在输入图像上滑动并计算加权和。这种机制使得每个神经元仅连接到前层的小部分区域,从而实现局部感知[^1]。此外,同卷积核在整个输入图像上的重复应用体现了权值共享的思想,这不仅减少了参数数量,还增强了模型对平移不变性的鲁棒性[^2]。 #### 特征提取过程 在个典型的 CNN 架构中,通常包含以下几个主要组件: 1. **卷积层 (Convolution Layer)** 输入图像经过多个卷积核的作用后生成组特征映射(Feature Map)。这些 Feature Map 表达了不同尺度下的边缘、纹理或其他视觉模式的信息。当步长设置为 1 或其他较小值时,可以更精细地捕捉细节;而较大的步长则有助于降低分辨率以减少计算量[^3]。 2. **激活函数 (Activation Function)** 常见的选择是非线性激活函数 ReLU (Rectified Linear Unit),它可以引入非线性变换,使网络能够拟合复杂的决策边界[^4]。 3. **池化层 (Pooling Layer)** 池化操作进步压缩数据维度,在保持重要特征的同时减小计算负担。最大池化(Max Pooling)是最常用的策略之,选取窗口内的最大值作为代表。 4. **全连接层 (Fully Connected Layer)** 经过若干轮卷积与池化的预处理之后,最终得到的是高度抽象后的低维表示形式。此时再接入传统的多层感知机完成分类或者回归任务即可。 以下是基于 Python 和 TensorFlow/Keras 实现的个简单 CNN 示例代码片段: ```python import tensorflow as tf from tensorflow.keras import layers, models model = models.Sequential() # 添加第个卷积层+ReLU激活+最大池化 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1))) model.add(layers.MaxPooling2D((2, 2))) # 更深层次... model.add(layers.Flatten()) model.add(layers.Dense(64, activation='relu')) model.add(layers.Dense(10)) # 输出层假设为10类问题 ``` #### 可视化工具推荐 为了更好地理解和调试 CNN 结果,可以借助些可视化技术展示中间各阶段产生的 feature maps 。例如 TensorBoard 提供了个直观界面让用户观察训练过程中权重变化情况以及梯度流动状况等信息。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值