递归 – 如何在图中找到所有等效顶点?

等效顶点是具有相同“进入”和“向外”顶点的顶点.

《递归 – 如何在图中找到所有等效顶点?》

有人可以帮助我如何处理算法?

我正在考虑这样的事情:在同一时间搜索两个顶点,如果我找到相同的输入和输出顶点来打印它们等等,那么它将是实际的暴力,但是如何做到这一点,例如递归?
什么是最好的解决方案?

最佳答案 这是我提出的递归解决方案.

想象一下,除了两个顶点之外我们删除了所有顶点(无关紧要哪两个).

在您的示例中,假设我们删除了除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),这样x!= y在我们添加z之前添加z和x = y之前.这是因为:

假设x具有y不具有普遍性而没有的输出或输入顶点w.我们知道w!= z因为我们还没有添加z.然后,在我们添加z之后,y仍然错过了顶点w.因此,在我们添加顶点z之后x!= y.所以我们只需要检查是否有任何等价于z的顶点.

案例2

这种情况要简单得多.在你的例子中,假设我们最后添加d,(回想一下我们之前添加了顶点a,b和c).我们计算出a和c是等价的,我们需要在添加d后检查它们是否仍然是等价的.请注意,我们需要做的就是检查a和c是否都有d作为传出或进入顶点.并比较它们.

因此,总之,我们从两个任意顶点开始,并检查它们是否相等.之后,我们逐个添加每个顶点,我们检查案例1和案例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).

点赞