等效顶点是那些具有相同' ingoing'和'外向'顶点。
有人可以帮我解决算法问题吗?
我在想这样的事情:在同一时间搜索两个顶点,如果我找到相同的输入和输出顶点来打印它们......等等,所以它将是实际的暴力,但如何使用递归这样做呢? 什么是最好的解决方案?
答案 0 :(得分:1)
一种方法是向每个顶点添加列表,一个用于输入顶点List ingoingVertices
,另一个用于输出顶点List outgoingVertices
。然后遍历每个顶点的边,将访问顶点添加到第一个顶点内的List outgoingVertices
,每次从第一个顶点取出边时,将第一个顶点添加到访问顶点的List ingoingEdges
。然后迭代遍历顶点,检查两个顶点之间的列表是否相同,以找到它们的等价。
递归访问每个顶点然后执行该顶点与迭代每个顶点大致相同。强制一次仅比较两个顶点将会起作用,但在运行期间需要花费更多精力进行编码和更多时间。
答案 1 :(得分:1)
这是我提出的递归解决方案。
想象一下,除了两个顶点之外我们都删除了所有顶点(不管两个顶点是什么)。
在您的示例中,假设我们删除了除 a 和 b 之外的所有顶点。请注意, a 和 b 是等效的,当且仅当有 a 到 b 的边缘时,是 b 到 a 的优势。这是我们的基本情况。
想象一下,我们逐个添加缺失的顶点(顺序并不重要)。我们需要考虑两种情况。 i)我们需要在添加顶点时检查是否有任何顶点集合等效。 ii)我们需要检查是否有任何相同的顶点集仍然是等价的。
案例1。
在您的示例中,假设我们添加了 c ,(回想一下,我们已经开始使用顶点 a 和 b )。我们肯定知道 a 和 b 不相同。为什么?因为 a 的传出顶点缺少 b ,而传出的顶点不是 c ,因为 c 之前没有在图表上。因此,我们只需要检查是否有任何等同于 c 的顶点。我们可以通过检查 c 的输出顶点的顶点和 c 的输入顶点的输出顶点来有效地执行此操作。然后,我们发现 a 和 c 是等效的。
注意:我使用 = 符号来表示帖子其余部分中顶点的等效性。
更一般地说,每当我们向图形添加一个新顶点(让我们说 z )时,我们知道不存在一对顶点的事实, (让我们说 x 和 y ),在添加 z 之前 x!= y 我们添加 z 后, x = y 。这是因为:
假设 x 有一个传出或进入顶点 w , y 没有失去一般性。我们知道 w!= z 因为我们还没有添加 z 。然后,在我们添加 z 之后, y 仍然会遗漏顶点 w 。因此,在我们添加顶点 z 之后, x!= y 。所以我们只需要检查是否有任何顶点等同于 z 。
案例2
这种情况要简单得多。在您的示例中,假设我们最后添加 d ,(回想一下我们添加了顶点 a , b 和 c 更早)。我们计算出 a 和 c 是等价的,我们需要在添加 d 后检查它们是否仍然等效。请注意,我们需要做的就是检查 a 和 c 是否 d 作为传出或进入顶点。并比较它们。
因此,总之,我们从两个任意顶点开始,并检查它们是否相等。之后,我们逐个添加每个顶点,然后检查 case 1 和 case 2 ,如上所述。
所以,让我们假设你有一个递归函数 EQ(n),它返回所有等价的顶点。然后,给定一个带有 n 顶点的图形,你可以调用 EQ(n-1),即丢失一个顶点(让我们说 z )。然后检查案例1 和案例2 ,了解 z 如何影响整体解决方案。在你的基本情况下,你有 n = 2 ,正如我在开头提到的那样。
因此,该算法的运行时间为 T(2)= O(1)和 T(n)= T(n - 1)+ O(n) )即可。因此,运行时间 O(n ^ 2)。