计算二分图中的路径数(长度 n)
Counting Number of Paths (Length N) in Bipartite Graph
我目前正在通过深度优先搜索(最多 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 分钟内完成。 (如果你的矩阵足够稀疏,你可能有机会,但你应该对这个主题做一些研究。
- 从C字符串中获取奇怪的字符串长度
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 如何在数组中找到字符串的长度
- C++A*算法并不总是在路径中具有目标节点
- 按边长度递归搜索图中所有可行路径
- 使用连续字符及其路径查找矩阵中最长路径的长度
- 如何打印 BFS 路径本身而不是此单词梯的路径长度?
- 如何在C 中完全遍历5x5网格以产生相同长度的路径(25)
- 在一个有权无向图中寻找某一长度的所有路径
- 红黑树的内部路径长度
- 计算二分图中的路径数(长度 n)
- 所有对的最短路径长度为无向加权稀疏图
- 内部路径长度
- 在C++中查找2D网格中长度为L的所有路径
- 如果所有路径都有相同的长度,如何开始Edmonds-Karp实现
- 文件夹路径序列化的最大字符长度
- 查询boost::filesystem::路径长度
- 长方体中的蚂蚁找到最短路径:给出长方体的长度、宽度和高度.输出应显示浮点中的最短距离
- 计算DAG中长度为K的路径个数