查找不同类型的连接组件

时间:2013-07-20 19:38:12

标签: algorithm

我想将有向图中的单连通分量定义为子图,其中对于每对节点u和v,存在从u到v或从v到u的路径。它还应该具有它不是另一个单连通组件的子图的属性。

我知道如何找到弱连接和强连接的组件。如何找到单连通组件?

一种非常低效的方法可能会从每个节点进行广度搜索,以查看可以从中获取哪些节点,并尝试以某种方式从这些节点集计算组件。

2 个答案:

答案 0 :(得分:1)

最大的单连接子图(我拒绝将它们称为“组件”,因为底层关系不是传递的)包含全部或不包含强连接组件。作为枚举最大单连通子图的第一步,然后将每个SCC折叠到一个顶点(即计算输入图的凝聚)。

非循环有向图的单连通子图具有以下特性:对于不同的节点u和v,存在从u到v的路径,或从v到u的路径,但不是两者。写你< v如果有从u到v和u!= v的路径,因为u< v或v<你,但不是两个,你< v和v< w表示u< w,关系<是严格的总订单。通过对子图中的顶点进行排序,我们发现它们位于单个路径上。当且仅当不能插入顶点时,此路径才是最大的,这意味着它从源(无入射边)开始,在接收端结束(没有出射边),并且仅包含出现在{{ 3}}非循环有向图。

这是一种枚举有向图G的最大单连通子图的算法。

  1. 找出G的强大成分。收缩它们,产生凝结G'。
  2. 计算G'的传递减少G''。
  3. 通过例如深度优先搜索来枚举所有源 - 宿路径,然后用G中的强组件替换每个节点。
  4. 这是一个具有指数级最大单连通子图的图族。所有边缘都朝下。

      *
     / \
    *   *
     \ /
      *
     / \
    *   *
     \ /
      *
     / \
      .
      .
      .
     \ /
      *
     / \
    *   *
     \ /
      *
    

答案 1 :(得分:1)

构造一个无向图G,它具有与原始图相同的节点集,以及在原始图中任意一个方向的边连接的每对节点之间的边。

通过广度优先搜索找到G的连通分量。循环遍历节点,但仅在不属于任何先前找到的组件的节点处开始新搜索。见(https://en.wikipedia.org/wiki/Connected_component_%28graph_theory%29#Algorithms

每个组件的节点也构成原始有向图的单连通分量的节点。

=============================================== ==============

我现在明白,每个节点必须边缘到无向图子集中的每个其他节点,所以需要的是G中的clique,而不是G的连通子图。不幸的是,问题的决策形式是NP完全的,函数形式是NP难的。

有关寻找集团的一些免费选项,请参阅algorithms