图中两个给定节点之间给定长度的所有路径

时间:2013-01-09 14:36:46

标签: algorithm graph

我遇到了这个问题:

http://www.iarcs.org.in/inoi/contests/oct2005/Advanced-2.php

问题基本上是图表。您将获得一个包含多达70个节点的图形,以及一个邻接矩阵,用于说明两个节点之间存在多少条边。每条边都是双向的。

现在问题要求您找出任意两个节点N1和N2之间的不同路径OF固定长度N的数量。路径可以重复。即,路径可以通过已包含的节点。

最天真的算法是进行广度优先搜索并检查Nth层中出现的N2数量,BFS树根植于N1。但这不会奏效。

如何去做?

1 个答案:

答案 0 :(得分:7)

这个问题的解决方案很简单 - 将邻接矩阵提高到N次幂,并且对于每对N1和N2,答案将位于单元(N1, N2)中 - 基本图论。

您还可以使用矩阵的binary exponentiation来更快地计算答案。

要理解上面算法的为什么,请尝试记下取幂的前几个步骤。您会注意到,在每次迭代时,矩阵都会保持给定固定长度的路径从1到N.如果您记下执行矩阵多重时如何计算单元格,您还应该看到它为什么会这样发生。

注意:对于如何计算长度高达固定长度的所有路径,还有一个非常酷的黑客 - 只需在起始顶点添加“循环”,从而使其可以从自身访问