计算二分图中的路径数(长度N)

时间:2012-06-30 04:58:21

标签: c++ algorithm graph-theory graph-algorithm bipartite

我正在通过深度优先搜索(最多10个级别)来计算二分图中长度$ n $的路径数。但是,我的实现需要5分钟以上,从具有3000多个元素的二分图中计算700万个长度为5的路径。我正在寻找一种更有效的方法来解决这个问题,我想知道文献中是否有这样的算法。

这些是无向二分图,因此路径中可能存在循环。

我的目标是在一分钟内计算100万个元素的二分图中长度为$ n $的路径数。

提前感谢您提出任何建议的答案。

2 个答案:

答案 0 :(得分:3)

我同意第一个想法,但它不是一个BFS。在BFS中,您可以浏览每个节点一次,这里可以进行多次 你必须保留2个数组(让我们称它为Cnt1,Cnt2,Cnt1是你到达一个元素的次数,你有一个长度为i的路径,而Cnt2是相同的,但长度为i + 1)。第一次所有元素在Cnt2中为0,在Cnt1中为1(因为在每个节点处有一条长度为零的路径)。

重复N次:
浏览所有节点
对于当前节点,您将浏览所有连接的节点,并且每个节点都会在Cnt2上的位置添加到达Cnt1中当前节点的次数。
当你完成所有节点后,只需在Cnt1中复制Cnt2并使Cnt2为零。
最后你只需添加Cnt1的所有数字,这就是答案。

答案 1 :(得分:2)

转换为广度优先搜索,只要有2条路径通向相同长度的同一节点,只需跟踪有多少这样的方式,而不是如何到达那里。

这将避免大量重复工作,并应提供显着的加速。 (如果n不小,则有更好的加速比,请继续阅读。)

我的目标是计算一分钟内100万个元素的二分图中长度n的路径数。

嗯,祝你好运?

另一种观察方法是,如果你采用图的邻接矩阵,并将其提升到n次幂,你得到的矩阵的所有条目都是从一个开始的长度末端的路径数地方,在另一个结束。所以你可以采取像反复平方的快捷方式。方便,不是吗?

不幸的是,百万元素图形产生了具有10 ^ 12个条目的邻接矩阵。将两个这样的矩阵与一个朴素算法相乘应该需要10 ^ 18个运算。当然我们有更好的矩阵乘法算法,但是你仍然没有达到10 ^ 15的操作。哪一项肯定不会在1分钟内完成。 (如果您的矩阵足够稀疏,您可能有机会,但您应该对该主题进行一些研究。)