我遇到了这个问题:
http://www.iarcs.org.in/inoi/contests/oct2005/Advanced-2.php
问题基本上是图表。您将获得一个包含多达70个节点的图形,以及一个邻接矩阵,用于说明两个节点之间存在多少条边。每条边都是双向的。
现在问题要求您找出任意两个节点N1和N2之间的不同路径OF固定长度N的数量。路径可以重复。即,路径可以通过已包含的节点。
最天真的算法是进行广度优先搜索并检查Nth层中出现的N2数量,BFS树根植于N1。但这不会奏效。
如何去做?
答案 0 :(得分:7)
这个问题的解决方案很简单 - 将邻接矩阵提高到N次幂,并且对于每对N1和N2,答案将位于单元(N1, N2)
中 - 基本图论。
您还可以使用矩阵的binary exponentiation来更快地计算答案。
要理解上面算法的为什么,请尝试记下取幂的前几个步骤。您会注意到,在每次迭代时,矩阵都会保持给定固定长度的路径从1到N.如果您记下执行矩阵多重时如何计算单元格,您还应该看到它为什么会这样发生。
注意:对于如何计算长度高达固定长度的所有路径,还有一个非常酷的黑客 - 只需在起始顶点添加“循环”,从而使其可以从自身访问