算法,该算法找到的从简单的路径的数目到在


34

任何人都可以建议我一个线性时间算法,需要作为输入向无环图和两个顶点和,并返回从简单路径的数目到在。 我有一个算法,其中将运行DFS(深度优先搜索),但如果DFS找到则它将不会更改路径出现的任何节点的颜色(从白色到灰色),以便如果这是任何其他路径的子路径,那么DFS也会再次通过该子路径。例如,考虑邻接列表,我们需要在其中找到从pv的路径数。G=(V,E)ststG
tstv p o s z o r s v s r r y y v v w zpv

poszorsvsrryyvvwzwz
这里DFS将以p开头,p然后说它进入pz因为它没有遇到v DFS将正常运行。现在秒path是psryv因为遇到v我们不会将顶点s,r,y,v的颜色更改为灰色。s,r,y,v然后由于v的颜色仍然是白色,所以路径pov然后由于s的颜色是白色,所以类似posryv路径poryvvposryvsporyv。还维护一个计数器,当遇到v时该计数器递增v

我的算法正确吗?如果没有,则需要对其进行哪些修改以使其正确,否则将不胜感激。

注意:这里我考虑了《 Cormen算法简介》一书中提供的DFS算法,该算法根据其状态为节点着色。因此,如果未访问,未探索和探索该节点,则该颜色将为白色,灰色和黑色。其他所有东西都是标准的。



4
请注意,有向无环图中的所有路径都必须很简单(由于无环性)。
Noldorin

Answers:


37

您当前的实现将计算DAG中正确的路径数。但是,如果不标记路径,则将花费指数时间。例如,在下图中,DAG的每个阶段将路径总数增加了3的倍数。可以通过动态编程来处理指数增长。

g

计算DAG 中 -路径的数量由以下递归给出: 路径Û = { 1 ,如果  Ù = Σ Û v È路径v 其它。st

Paths(u)={1if u=t(u,v)EPaths(v)otherwise.

DFS的简单修改将计算为

def dfs(u, t):
    if u == t:
        return 1
    else:
        if not u.npaths:
            # assume sum returns 0 if u has no children
            u.npaths = sum(dfs(c, t) for c in u.children)
        return u.npaths

不难看出每个边缘仅被查看一次,因此运行时间为。O(V+E)


我理解您的算法,并且由于使用了多次动态调用,因此可以通过使用动态编程来使其效率降低一点,因为这样可以更好地保存它。
撒拉卜2012年

1
@SaurabhHota,它使用动态编程。顶点首次遇到,它计算的路径的数目必须。这存储在u.npaths中。以后每次调用都不会重新计算其路径数,而只是返回u.npaths。Ť üutu
Nicholas Mancuso 2012年

1
对于这样的图,答案不只是m ^ n,其中m是一列中的节点数(此处为3),n是不包含s,t的列数(此处为4)。示例图的输出为3 ^ 4 = 81。
saadtaame 2015年

@saadtaame,当然;但是,我的目的只是展示图表的“长度”增长时的指数增长。当然,对于高度结构化的图,您可以以闭合形式计数,而列出的算法适用于所有图。
Nicholas Mancuso 2015年

3
在运行时间假设你可以执行在固定时间内的必要补充,但添加的数量可以有在最坏情况下的比特。如果您想要确切的路径数,则运行时间(计数位操作)实际上是。Θ V O V E O(V+E)Θ(V)O(VE)
JeffE

15

您只需要注意,从一个节点到目标节点的路径数就是从其子节点到目标的路径数之和。您知道该算法将始终停止,因为您的图形没有任何循环。

现在,如果在访问节点时保存了从一个节点到目标的路径数,则时间复杂度的顶点数将变为线性,而内存的节点数将变为线性。


0

可以使用邻接矩阵表示找到DAG中任意两个顶点之间的路径数。

假设A是G的邻接矩阵。在将A加上单位矩阵后取A的K次幂,得出长度<= K的路径数。

由于DAG中任何简单路径的最大长度为| V | -1,因此计算| V | -1次方将给出所有顶点对之间的路径数。

可以通过对每个TC:| V | ^ 2进行log(| V | -1)乘法来计算| V | -1次方。


问题要求一个线性时间算法。您的算法比这慢。
DW

@Vivek您可以在答案中提及定理的参考吗?
哈米德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.