以最少的运行次数遍历网格(图表)的每个边缘

时间:2018-03-01 00:22:06

标签: algorithm graph graph-algorithm graph-traversal

我有一个(m x n)网格,其中每条边具有相同的单位长度1.每次运行从起点(0,0)开始并移动到端点(m,n)。每次运行只能向右或向上移动,即不允许向后行进,因此每次运行必须包括正好(m + n)的长度。

我需要多少次跑步才能确保我已遍历此网格中的每个边缘?即为了确保(m×n)网格的每个边(角)至少经过一次,需要从(0,0)到(m,n)的最小运行次数是多少?注意,我的目标不是从(0,0)或(m,n)找到路径数。我只想探索整个网格中的所有边缘。

谢谢!

3 个答案:

答案 0 :(得分:0)

你必须遍历每一行和每一列,这给出了n + m个路径的答案。

答案 1 :(得分:0)

转动网格,使(0,0)位于顶部,(m,n)位于底部。你现在有一个很好的从上到下的流动,让重力"重力"提供有向图的边缘方向。

调整图表,使边缘最接近45度角。 (0,0)位于顶部;第二层由(0,1)和(1,0)组成;第三个是(0,2),(1,1),(2,0),依此类推。 i移动后,您将位于坐标总和为i的节点上。

现在,由于每个节点都有1或2个边,1或2个边出,因此显示最大图层大小为min(m, n)个节点,并且最大边数为任何给定的步骤都是2*(min(m, n) - 1)。构建一系列将遍历该运行次数的每个层或步骤的路径也是微不足道的。编号从一侧到另一侧的节点/边缘;使用相应的数字来计划每次运行。当你在一个维度上达到极限时,只需坚持边缘以进行剩余的运行。

因此,如果您只需要点击每个节点,则可以在min(m, n)次运行中执行此操作。如果您需要每个优势,那么2*(min(m, n) - 1)就会运行。

答案 2 :(得分:0)

要覆盖每个边缘,您需要m+(n-2)个路径。一个简单的例子包括水平和垂直路径,如下所示。请注意,红色路径是重复的,因此不需要第二个图中的红色路径。这就是等式中-2的原因。

enter image description here