📜  重贴标签算法

📅  最后修改于: 2021-04-30 03:37:35             🧑  作者: Mango

重新标记前端算法用于查找网络中的最大流量。重贴标签的算法比通用的推重贴标签的方法更有效。在push-relabel方法中,我们可以按任意顺序应用push和relabel的基本操作。重贴标签算法会仔细选择顺序,并有效地管理网络数据结构。

首先,我们需要了解基本操作,即pushrelabel
网络中的每个顶点都有2个与之关联的变量,分别是高度变量(h)过剩流量(e)

  1. 推送:如果顶点有过多的流量,并且有一个相邻节点的高度较低(在残差图中),则我们将流量从顶点推送到较低高度的节点。
  2. 重新标记:如果顶点有过多的流动,并且没有可用的较低高度的相邻节点,则我们可以使用重新标记操作来增加顶点的高度,以便其可以执行推入操作。

重新标记前算法会维护网络中的顶点列表。它从列表的开头开始,并反复选择一个溢出的顶点u并对其执行放电操作。
卸料操作将执行推入和重新贴标签操作,直到顶点u没有正的过剩流量(e)
如果重新标记了顶点,则会将其移到列表的最前面,然后再次扫描算法。

算法:

  • 预流高度初始化为与通用push-relabel算法相同的值。
  • 初始化列表L ,该列表包含除源和接收之外的所有顶点。
  • 将每个顶点u的当前指针初始化为u的邻居列表N中的第一个顶点。邻居列表N包含那些具有残留边的顶点。
  • 当算法到达列表L的末尾时。
    • 从列表L中选择顶点u并执行放电操作。
    • 如果u通过放电重新标记,则将u移动到列表的最前面。
    • 如果将u移到列表的最前面,则下一次迭代中的顶点是u在列表中新位置之后的那个顶点。

例子:
考虑给定的流动网络。右侧显示初始列表L =(B,C),其中初始u = B。

在预流初始化操作之后。在列表L中的每个顶点下是其邻居列表N,其中当前邻居盘旋了。

顶点B由于有多余的流量3(e = 3)而经历排放操作。顶点B没有高度较低的节点,因此它执行重新标记操作(h = 1),并将流量1推到顶点C.

顶点B仍然有多余的流量2(e = 2),因此它执行重新标记操作(h = 5)并将流量2推送到顶点A.由于顶点B被重新标记,它仍位于列表的前面。现在顶点C经历排放操作,因为它有多余的流量1(e = 1)。

顶点C执行重新标记操作(h = 1)并将流1推送到节点D.由于顶点C执行了重新标记操作,因此将其移到列表的最前面。

现在,顶点B跟随L中的顶点C,但顶点B没有多余的流动。 RELABEL-TO-FRONT已到达列表L的末尾并终止。没有溢出的顶点,因此预流是最大流。这里最大流量是1。

时间复杂度:在网络G =(V,E)上以O(V 3 )时间运行。因此,它比在O(V 2 E)时间内运行的常规推送重新标记算法更有效。

参考文献: Clifford Stein,Thomas H. Cormen,Charles E. Leiserson,Ronald L. Rivest撰写的算法入门第三版