找到有向图中任意两个顶点之间的所有边

时间:2013-08-06 12:31:30

标签: algorithm graph depth-first-search

我有一个算法来查找有向图的边缘,从顶点 u 到任何其他具有O(| V | + | E |)时间复杂度的顶点(基于DFS) 。我必须开发一种算法来找到O(| V || E |)中任意两个顶点 u v 之间的边。

您有任何建议或提示可以实现这一目标吗?

如果我为每个顶点重复DFS-Visit,则只有第一次顶点是白色时,以下次调用将不执行任何操作。 如果我在此之前重置颜色,则算法将为O(| V | ^ 2 + | V || E |)。

提前非常感谢你!

1 个答案:

答案 0 :(得分:3)

将问题拆分为子问题,您可以使用算法来实现所需的复杂性,如下所示:

  • 在结构图(基础无向图)上使用DFS,并查找其中的所有连接组件。设它们是(V1,E1),(V2,E2),......,(Vk,Ek)
  • 对于每个此类组件,运行您的算法。很明显,两个节点之间没有桥接,它们位于不同的组件中。

复杂性将是:
第1步O(V+E) - DFS。
第2步

  • 我们使用您从每个节点重复开发的算法为黑色 每个组件上的框,因此组件i的复杂性为O(V_i^2 + V_i*E_i)
  • 由于每个组件iE_i >= V_i -1(否则不是。{ 已连接,树有|V|-1个边缘),O(ViEi + Vi^2) = O(ViEi)
  • 因此,此步骤的复杂性为O(V1E1 + V2E2 + ... + VkEk)
  • 请注意,对于每个i E_i <= E,因此复杂性不是 更糟糕的是:

    O(V1E + V2E + ... + VkE)  = O(E *(V1+V2+ ... + Vk)) = O(VE)
    

因此,根据需要,总复杂度为O(VE)