Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 二部图中路径数(长度N)的计数_C++_Algorithm_Graph Theory_Graph Algorithm_Bipartite - Fatal编程技术网

C++ 二部图中路径数(长度N)的计数

C++ 二部图中路径数(长度N)的计数,c++,algorithm,graph-theory,graph-algorithm,bipartite,C++,Algorithm,Graph Theory,Graph Algorithm,Bipartite,我目前正在通过深度优先搜索(最多10级)计算二部图中长度为$n$的路径数。然而,我的实现需要5分钟以上的时间从一个包含3000多个元素的二部图中计算出长度为5的700万条路径。我正在寻找一种更有效的方法来解决这个计数问题,我想知道文献中是否有这样的算法 这些是无向二部图,因此路径中可能存在循环 我的目标是在一分钟内计算100万个元素的二分图中长度为$n$的路径数 提前感谢您提供的任何建议答案。转换为广度优先搜索,并且每当您有两条路径以相同的长度指向同一节点时,只需跟踪有多少条这样的路径,而不是您

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

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

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


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

转换为广度优先搜索,并且每当您有两条路径以相同的长度指向同一节点时,只需跟踪有多少条这样的路径,而不是您是如何到达的

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

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

嗯,祝你好运

另一种研究的方法是,如果你取图的邻接矩阵,并将其提升到n次方,你得到的矩阵的所有条目都是从一个地方开始,到另一个地方结束的长度路径的数量。所以你可以走捷径,比如重复平方。很方便,不是吗


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

我同意第一个想法,但它不是一个很好的BFS。在BFS中,每个节点只经过一次,在这里可以经过很多次。
必须保留2个数组(我们称之为Cnt1,Cnt2,Cnt1是到达元素的次数,路径长度为i,Cnt2相同,但长度为i+1)。第一次,所有元素在Cnt2中为0,在Cnt1中为1(因为从每个节点开始有一条长度为零的路径)。

重复N次:
浏览所有节点
对于当前节点,您将遍历其所有连接的节点,对于每个节点,您将在Cnt2上的该位置添加您到达Cnt1中当前节点的次数。
完成所有节点后,只需将Cnt2复制到Cnt1中,并将Cnt2设为零。

最后,您只需添加Cnt1的所有数量,这就是答案。

您是否在寻找从一个源到一个目标的路径?一个源多个目标?多源多目标?路径无要求。它们可以有多个源和多个目标。有循环的路径也被计算在内。我读了一些关于邻接矩阵的书。它们仅适用于DAG或n=2的无向矩阵。如果这是错误的,请纠正我。这个问题中的二部图是一个无向图。如果将其转换为有向图,则它不是DAG。我不太清楚在二部图中,通向同一节点的路径数与长度为$n$的路径数之间的关系。谢谢您的回答。@swtdrgn我纠正您的错误,因为它是错误的。如果你承认循环是路径的一部分,那么提升为幂的邻接矩阵就是你想要的。至于它是如何关联的,那个矩阵的条目之和就是路径的总数。谢谢。如果我把图转换成一个伴随矩阵,它将是一个稀疏对称矩阵。谢谢。我真的试过了,速度大大提高了。