Adam's Kids教授(确定最大流量)

时间:2015-05-27 22:01:00

标签: algorithm max-flow ford-fulkerson

我需要帮助来理解如何解决以下问题:

  

亚当教授有两个孩子,不幸的是,彼此不喜欢。这个问题非常严重,以至于他们不仅拒绝一起走路上学,而且实际上每个人都拒绝走在那天另一个孩子踩到的任何街区上。孩子们在拐角处的路径没有问题。幸运的是,教授的房子和学校都在拐角处,但除此之外,教授不确定是否可以将两个孩子送到同一所学校。教授有一张城镇地图。说明如何制定确定两个孩子是否可以作为最大流量问题进入同一所学校的问题。

我唯一能想到的就是有一个四角图。左上角表示源(Adam的房子),右下角表示接收器(学校)。右上角的角x代表附近的一个角落,而y代表邻域的左下角。因此,我们的路径来自S -> C1S -> C2C1 -> tC2 -> t。每条路径的权重为1,因为它只能容纳一个孩子。该图的最大流量为2,证明他们可以参加同一所学校。

我遇到的问题是我不确定我遇到的这个解决方案是否能解决问题。最让我感到困惑的部分是我不确定这意味着什么:但实际上每个人都拒绝走在另一个孩子当天踩到的任何街区上。这句话怎么样如果两个人住在同一个街区的同一个房子里有意义吗?

5 个答案:

答案 0 :(得分:1)

更新:原来,我误解了这个问题。这个问题要求找到" edge-disjoint"路径,而不是顶点不相交的路径。在这种情况下,解决方案只是将每个角表示为一个顶点,每个块作为一个容量为1的边,并运行常规的最大流(正如下面Curious所正确建议的那样)。

我认为OP具有基于

的混淆
  

但实际上每个人都拒绝走在另一个孩子当天踩到的任何街区上。如果两个人住在同一街区的同一栋房子里,这个陈述怎么有意义呢?

请注意,孩子住在同一个角落的同一个房子里,而不是同一个区块

我留下其余的答案,万一有一天实际上是在寻找顶点不相交的问题:

如果我正确理解了问题,它要求的是找到从源到接收器的两个顶点不相交的路径。只是按原样使用图形,并为每个边缘分配1的容量是不够的。请考虑以下示例:

s -> C1, C1 -> C3, C3 -> C4, C4 -> t
s -> C2, C2 -> C3, C3 -> C5, C5 -> t

如果为每个边缘分配1的容量,并运行任何最大流量算法,它将找到最大流量为2,但是没有两个顶点不相交的路径(两个路径)将通过顶点C3)。

要解决此问题,您需要调整图表。对于除st之外的每个顶点,将其拆分为两个。假设顶点u分为u'u''。让进入u的所有边进入u',来自u的所有边都来自u''(这些边的容量无关紧要,只要它是正数,所以你可以将它设置为1)。最后,添加容量为u'的{​​{1}}到u''的边缘,并在此图表上运行最大流量。由于我们在分割节点之间添加了这些边,每个顶点最多只能使用一次,因为要使用顶点我们需要输入1,从u'转到u'并且从那里退出,只有一个流量单位可以从u''转到u'

答案 1 :(得分:1)

让我们保持简单.. 第一件事。为什么你只限制在他家和学校以外的2个角落。在问题中没有提到这种方式。

Adam的问题建模可以像这样

顶点:城镇的所有角落

定向边:所有在两个方向连接角落的道路,即如果我们有2个角p,q那么我们将有从p到q以及从q到p的边缘

表示所有边(u,v),c(u,v)=1

现在解决最大流量问题,如果是>= 2,亚当很幸运。

答案 2 :(得分:0)

我从来没有听说过最大流量问题,所以这是我从维基百科收集的内容。

(V,E)似乎应该为街道的每个交叉点和每条街道的一条边(交叉点之间)设置一个顶点。然后每个边缘都有容量1(如你所说)。当然,如果其中一个孩子进入学校,他们也可以回家(使用"相反图表中的类似路径"所有边缘都反转)。

然后唯一的歧义是:边缘的直接是什么?如果不必指导图表,这可以作为问题的表述。

答案 3 :(得分:0)

Wikipedia

由于这个问题指出房子和学校(t)都在角落里,我认为角落不算作“走路”和#34;并且问题是他们在拐角处穿过路径没有问题,所以例如他们可以一起穿过街道到另一个街区,只要他们中的一个人行道到另一个角落而另一个立即穿过街道到另一个街道块。

在这种情况下,流程中的限制因素是块,因此它们必须成为容量为1的流程图中的边缘。但它们连接的是什么?他们必须连接到其他块。想象一下9块方块:

1 2 3
4 5 6
7 8 9

房子位于1的东南角,学校位于5的东南角。两个孩子都可以过马路到5号街区,但只有一个人可以在5号街区附近走到对面角落的学校。另一个人也可以穿过4号区,然后到7号区,然后到8号区,在那里他可以过马路到5号街角的学校。

所以房子可以到达第1,2,4和5区。学校可以从5,6,8或9开始。我的第一个想法是将每个区块建模为两个节点,输入和输出,以及容量为1的边连接输入到输出。其他节点将与容量至少为2的边链接。您还需要s和t的节点。链接到1,2,4和5的输入,5,6,8,9的输出转到t。然后将块输出链接到您可以从一个角落到达的任何块的输入,即1的输出转到2,4,5的输入,并且2,4,5的输出也转到1的输入。

一种更简单的方法可能是每个角都是连接到它周围的块输入的节点,并且它周围的块的输出连接到角节点。除了连接块输入和输出的容量为1之外,所有边缘的容量应至少为2。这样,限制因素是“走在块上”#34;。只要流量最终为2,就可以制造出来。

因此,让我们简化图表并摆脱我们不会使用的块。一个孩子可以从第5个街区到第5个街区,另一个可以从街道到4个街区,然后在第8个街区穿过街区8,沿着街区8步行到学校所在的街角:

 s
4 5
 a t
  8

以下是边缘:

s->4in (capacity 2)
s->5in (capacity 2)
4in->4out (capacity 1) // limiter
5in->5out (capacity 1) // limiter
8in->8out (capacity 1) // limiter
4out->s (capacity 2)
4out->a (capacity 2)
5out->s (capacity 2)
5out->a (capacity 2)
5out->t (capacity 2)
8out->a (capacity 2)
8out->t (capacity 2)
a->4in (capacity 2)
a->5in (capacity 2)
a->8in (capacity 2)

一个孩子的路径s-> 5in-> 5out-> t

其他孩子的路径s-> 4in-> 4out-> a-> 8in-> 8out-> t

答案 4 :(得分:-3)

我也在寻找解决方案并发现了这一点,它确实对我来说是正确的。

http://www.repond.ch/ressources/cse/algorithme/week10/exercise7-sol.pdf?PHPSESSID=col0hua0ehpk57givsva99mco4

“让我们用图形G(V,E)按以下方式对城市地图进行建模:V包含城镇中的每个角落,E包含道路。更具体地说,我们假设两个节点之间存在边缘u ,v属于V. 如果有一条连接城市角落u和v的道路。我们假设每个边缘的容量为1.此外,让亚当教授的家成为 来源,s和学校是下沉,t。现在我们可以将问题表述为最大流量问题:边缘上的流量(u,v)将表示是否有任何一个孩子踩到了连接角落u和v的道路。此外,我们只允许整体流动如此f (u,v)在这种情况下= 1。因此,由于图中每个边的容量是c(u,v)= 1,如果流经过一个链路,则该链路不能再使用。这意味着另一个孩子不会走这条路去上学。现在,如果两个孩子都可以上学,这意味着从源(房子)到水槽(学校)的流量至少为2.如果有人能找到最大值 G从 s到t 的积分流量值至少为2,那么两个孩子都可以上学。否则,就不可能。“