如果我们从s开始,它会不会继续发现?
给出一个线性时间算法,该算法将有向非循环图G =(V,E)和两个顶点s和t作为输入,并返回G中从s到t的路径数。
溶液:
这里的基本思想是从顶点t开始,并在反向使用深度优先搜索,直到我们到达顶点。每个并保持一个计数器,指示从顶点t找到的唯一反向路径的数量。
- 将所有顶点的计数器初始化为0。
- 使用顶点t作为根,以反向方式开始深度优先搜索。
- 对于在广度优先搜索中检查的每个边(u,y)。
Counter(v) = max{ Counter(v) + 1, Counter(v) + Counter(u) }
- 返回柜台。
醇>
答案 0 :(得分:0)
你可以试试这个: (这是http://arxiv.org/PS_cache/cond-mat/pdf/0308/0308217v1.pdf,第5页)。
我们将根据从S开始的顶点路径的数量,给出以s开头的不同顶点的权重,并根据它们远离s的边数来设置它们的距离。
对于与这些顶点之一相邻的每个顶点j和尚未定义的d(j), 如果w(j)= 0,则指定w(i)= w(j)/ ,将父亲的wt分配给j / 否则如果d(j)= d(i)+1,那么w(j)= w(i)+ 1.
重复步骤3直到达到T. wt(t)将给出从s到T的最短路径的数量。
因此,本文解释了为什么这是线性的。
答案 1 :(得分:0)
没有需要以反向运行算法。您也可以使用正向搜索在线性时间内计算解决方案。我不认为解决方案说你需要反过来做,而你却没有。
正向和反向搜索都基于相同的一般标识,即
number-of-paths(s, t) =
sum over nodes 'c' of any cut of the graph that separates s from t:
number-of-paths(s, c) * number-of-paths(c, t)