路径的“长度”是路径中的边数。
给定一个源顶点和一个目标顶点,我想找到从源顶点到 给定长度* k 的目标顶点的 路径 数。 *
我们可以根据需要多次访问每个顶点,因此,如果从a到的路径b是这样的:a -> c -> b -> c -> b它被认为是有效的。这意味着可能会有周期,我们可以多次穿越目的地。
a
b
a -> c -> b -> c -> b
两个顶点可以通过多个边连接。因此,如果顶点a的顶点b是由两个边缘,则该路径连接,a -> b经由边缘1和a -> b经由边缘2被认为是不同。
a -> b
顶点数N≤70,而路径长度K≤10 ^ 9。
由于答案可能非常大,因此将以某个数字为模进行报告。
到目前为止,我一直在想:
我们可以使用广度优先搜索而无需将任何顶点标记为已访问,在每次迭代中,我们都跟踪该路径所需的边数“ n_e”,并记录我们每个边的重复边数的 乘积 “ p”路径有。
如果n_e大于k,则搜索搜索应终止;如果到达n_e等于k 的目的地,则搜索将终止,并增加p路径数。
n_e
p
我认为我们可以使用深度优先搜索来代替广度优先搜索,因为我们不需要最短的路径,而广度优先搜索中使用的Q的大小可能还不够。
我正在考虑的第二种算法类似于使用这种方法的弗洛伊德·沃沙尔算法。只有我们不需要最短的路径,所以我不确定这是正确的。
我的第一个算法遇到的问题是’K’可以达到1000000000,这意味着我的搜索将一直运行直到它具有10 ^ 9条边并且n_e边数在每个级别上仅增加1,这将非常速度很慢,而且我不确定是否会因大量输入而终止。
所以我需要一种不同的方法来解决这个问题。任何帮助将不胜感激。
因此,这是我记得的一个漂亮的图论技巧。
制作一个邻接矩阵A。A[i][j]如果i和之间有边,则为1 j,否则为0。
A
A[i][j]
i
j
然后,长度k在i和之间的路径数j就是[i][j]A ^ k 的条目。
k
[i][j]
因此,要解决此问题,请A使用矩阵乘法来构建和构造A ^ k(此处通常采用做幂运算的技巧)。然后只需查找必要的条目。
编辑:嗯,您需要在矩阵乘法内进行模运算,以避免溢出问题,但这是一个小得多的细节。