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

Counting Number of Paths (Length N) in Bipartite Graph

本文关键字:长度 路径 二分图 计算      更新时间:2023-10-16

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

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

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

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

我同意第一个想法,但它不完全是一个BFS。在BFS中,每个节点你遍历一次,在这里你可以去很多次。
你必须保留 2 个数组(我们称之为 Cnt1 和 Cnt2,Cnt1 是你到达一个元素的次数,你有一个长度为 i 的路径,而 Cnt2 是相同的,但长度为 i + 1)。第一次所有元素在 Cnt2 中为 0,在 Cnt1 中为 1(因为每个节点都有一条长度为零的路径)。

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

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

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

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

嗯,祝你好运?

另一种研究方法是,如果您采用图的邻接矩阵,并将其提高到n次方,则您获得的矩阵的所有条目都是从一个地方开始,在另一个地方结束的长度路径数。 因此,您可以采取重复平方等捷径。 方便,不是吗?

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