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

问题描述 投票:1回答:3

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

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

谢谢!

algorithm graph graph-algorithm graph-traversal
3个回答
0
投票

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


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)


0
投票

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

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.