为什么这个解决方案说DFS必须反向运行?

时间:2011-11-03 00:37:49

标签: algorithm depth-first-search

如果我们从s开始,它会不会继续发现?

  

给出一个线性时间算法,该算法将有向非循环图G =(V,E)和两个顶点s和t作为输入,并返回G中从s到t的路径数。


溶液:

  

这里的基本思想是从顶点t开始,并在反向使用深度优先搜索,直到我们到达顶点。每个并保持一个计数器,指示从顶点t找到的唯一反向路径的数量。

     
      
  1. 将所有顶点的计数器初始化为0。
  2.   
  3. 使用顶点t作为根,以反向方式开始深度优先搜索。
  4.   
  5. 对于在广度优先搜索中检查的每个边(u,y)。 Counter(v) = max{ Counter(v) + 1, Counter(v) + Counter(u) }
  6.   
  7. 返回柜台。
  8.   

2 个答案:

答案 0 :(得分:0)

你可以试试这个: (这是http://arxiv.org/PS_cache/cond-mat/pdf/0308/0308217v1.pdf,第5页)。

我们将根据从S开始的顶点路径的数量,给出以s开头的不同顶点的权重,并根据它们远离s的边数来设置它们的距离。

  1. 以wt(S)= 1和d(s)= 0;
  2. 开始
  3. 与S相邻的每个顶点都给出权重= w(s)= 1且d(i)=(d)+1;
  4. 对于与这些顶点之一相邻的每个顶点j和尚未定义的d(j), 如果w(j)= 0,则指定w(i)= w(j)/ ,将父亲的wt分配给j / 否则如果d(j)= d(i)+1,那么w(j)= w(i)+ 1.

  5. 重复步骤3直到达到T. wt(t)将给出从s到T的最短路径的数量。

  6. 因此,本文解释了为什么这是线性的。

答案 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)