诱导子图;两个节点之间存在路径

时间:2011-06-03 00:45:31

标签: algorithm shortest-path graph-algorithm subgraph

对不起文字的墙,它尽可能简洁!

我从G内部得到了一个非常大的有向图G和顶点子集S.我想要做的是找到由S引起的G的子图,另外考虑如果存在一些路径在G中的顶点p和顶点q之间,在诱导子图中的这两个顶点之间存在边。这是关键;它比通常的诱导子图问题更复杂(我认为)。

我能想到解决问题的最基本方法如下(我意识到它可能不是最有效的,如果你有其他建议不是复杂的话请告诉我实现):对于S中的每对顶点,测试它们之间是否存在路径。如果存在这样的路径,则在诱导子图中的p和q之间插入一条边。就我的目的而言,n ^ 2时间不是坏。

所以,我想我有两个问题: 1)确定两个顶点之间的路径是否存在的最快方法是什么?我不需要知道路径,只知道它是否存在。此外,如果有一些预处理,我可以对整个图形做更快的计算,那可能是什么,因为我必须在每对顶点之间执行这个计算?

2)有没有比我建议找到我描述的诱导子图类型更快的方法?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

查找两个顶点之间是否存在路径的问题称为传递闭包问题,并且在一般情况下它与矩阵乘法一样难。我首先在你的图上运行一个强连接组件算法,将循环压缩到一个节点并形成一个有向图。如果你很幸运,你会有一些很大的周期,这将使随后的传递问题变得容易。然后我在该图上运行Floyd Warshall所有对最短路径算法来计算传递闭包,因为它的编码非常简单。也许其中一个基于o(n ^ 3)矩阵乘法的算法会更快,但我怀疑它会更快,因为常数是如此之低Floyd Warhsall。

这是strongly connected components的快速算法。

这包含matrix multiplication and transitive closure.

等效性的证明

我不确定是否有任何好方法来计算传递闭包来解决原始问题。我怀疑不是,但另一方面,有时聪明的人会想出一些伟大的东西。