有向图分解

时间:2015-11-09 10:03:23

标签: algorithm graph

我想将有向无环图分解为最小数量的组件,以便在每个组件中以下属性成立 - 对于组件中的所有顶点对(u,v),存在从u到v 从v到u的路径。

这有什么算法吗?

我知道在条件中由替换或替换时,它与查找强连接组件的数量(使用DFS可能)相同。

*编辑:* 如果定向图包含循环(即它不是非循环的)会发生什么?

2 个答案:

答案 0 :(得分:0)

我的想法是使用DFS在拓扑上对O(n)进行排序,然后考虑这个属性可以为假的顶点。对于那些从2个不同的分支加入,或者分成2个不同分支的人来说,这可能是错误的。

我会从任何起始顶点(拓扑排序最低)开始,并按照它的路径进入随机分支,直到你不能再进一步从图形(第一个组件)中删除这条路径。这将重复到图表是空的,你有所有这些组件。

这似乎是一个贪婪的算法,但考虑到你在第一次运行中找到一个非常短的路径(通过随机运气不好)或者你找到了一条最长的路径(好运)。然后你仍然需要在另一个算法步骤中找到那个小分支组件。

复杂性将是O(n *组件数)。

当存在条件时,您应该考虑任何定向图,因为DAG不能具有强连接组件。

答案 1 :(得分:0)

现有的两个答案都存在我在评论中概述的问题。但是,为什么没有分解成组件可以在一般情况下起作用,这是一个更为根本的原因。首先,让我们简明扼要地表达关系" u和v属于分解的相同组成部分"作为你#v。

它不是传递性的

为了将关系#表示为组件中的顶点,该关系必须是equivalence relation,这意味着它必须transitive:即,如果x#y和y #z,x#z必定是真的。我们的关系是#transitive?不幸的是答案是" No",因为它可能是从x到y的路径(所以x#y),以及从z到y的路径(所以y#z),但是没有从x到z或从z到x的路径(因此x#z 保持),如下图所示:

       z
       |
       |
       v
x----->y

问题在于,根据上图,x和y属于同一个组件,y和z属于同一个组件,但x和z属于不同的组件,这是矛盾。这意味着,通常,不可能将关系#表示为对组件的分解。

如果实例恰好是可传递的

所以一般没有解决方案 - 但是仍然可以存在关系#恰好是传递的输入图,因此我们可以为此计算解决方案。这是一种方法(虽然可能不是最有效的方式)。

计算所有顶点对之间的最短路径(使用例如Floyd-Warshall algorithm,在n(顶点)的O(n ^ 3)时间内。现在,对于每个顶点对(u,v),d(u,v)= inf,表示根本没有办法从u到达v,表明从u到v有一些路径。回答问题"你是否持有?" (即"你和v属于分解的同一个组成部分吗?"),我们可以简单地计算d(u, v) != inf || d(v, u) != inf

这为我们提供了一种关系,我们可以用它来构建无向图G'其中有一个顶点u'对于每个原始顶点u,以及两个顶点之间的边缘u'和v'当且仅当d(u, v) != inf || d(v, u) != inf。直观地说,此新图表中的每个连接组件都必须是clique。通过首先从每个顶点执行一系列DFS遍历为每个顶点分配一个组件标签,然后检查每对顶点是否属于同一组件,当且仅当如此时,可以在O(n ^ 2)时间内检查此属性它们通过边缘连接起来。如果属性成立,那么得到的派系对应于期望的分解;否则,没有有效的分解。

有趣的是,有些图形不是强连接组件链(如claimed by Zotta),但它们确实具有传递性#关系。例如,tournament是一个有向图,其中在每个顶点之间在某个方向上有一条边 - 所以在这样的图中,每个顶点对都是明确的#。但是,如果我们将顶点1编号为n并且仅包括从较低编号到较高编号顶点的边,则不会有循环,因此图形没有强连接(如果n> 2,那么显然它是&#39 ;不是路径。)