动态规划-最短路径个数问题

来源:互联网 发布:四海认证淘宝渔具钓竿 编辑:程序博客网 时间:2024/05/17 02:25

这里需要图,队列等相关知识,请参阅我之前的博客,都有详细说明。


问题:个点之间的线路如图所示,点与点之间的距离都是“1”,算A到T的最短路径,以及共有多少种这样的路径。

 

显然用图的广度搜索结合动态规划来解决这个问题是比较容易的。

数据结构:

setp(i):表示i对用的点到A点的最小路径步数。

path_num(i):表示i对应的点到A点最小路径的个数

状态转移方程:

      if(step(j)==0)

           step(j)=step(i)+1

           path_num(j) = path_num(i)

     if(step(j) = step(i)+ 1)

           path_num(j)= path_num(i)+ path_num(j)

why:

第一种情况:

j是对i通过广度搜索找出的。如上图到G点路径只能是:F—>G,I—>G

当第一次到达G,也就是F—>G,此时step(G)==0,那么就是说G点是第一次触达,根据已知的信息,先记录着:

step(G)=step(F)+1 = 2 + 1 = 3

path_num(G) = path_num(F) = 2

  这里有人可能说step(F),path_num(F)怎么算出来的,F是从B,E那算出来的,我们就是用前面的值去算后面的值,这就是之前说的动态规划,那么起点呢,我们规定step(A)= 0,path_num(A)= 1 ;即A到A的最短路径是0,A到A共有1种这样的最短路径。

step(G)=step(F)+1:(A到G的步数)=(A到F的步数)+1

path_num(G) = path_num(F):(A到G的路径个数)=(A到F的路径个数)X(F到G的路径个数)。乘法原理….,而F到G的路径个数为总是1。好像是废话…

 

第二种情况:

当F—>G之后,又会出现I—>G了,此时根据F—>G算出的step(G)= 3,path_num(G)= 2,以及step(I)= 2,path_num(I)= 1,这些值都是能根据之前已知值迭代出来的。

当出现I—>G时,此时的step(G)是有值的,这个值是F当初触达算出的,现在I触达了,这时就考虑怎么去更换。

如果step(I)+1 > step(G),I到G的步数比原来的还大,显然不用考虑更换了,但是这里因为用了广度搜索以及每次都是取最小值,step(I)+1 >step(G)是永远不会出现的,你在程序里写不写这段代码都可以,写上了可能更方便逻辑的理解。

同理step(I)+1 < step(G)也是不会出现的,你想想I到G都是用广度搜索算出来的,也就是说I到G的距离永远是1。所以只能出现2种情况要么step(G)==0要么step(I)+1 = step(G),step(G)==0已经讨论过了。

此时step(I)+1 = 2+1 = step(G)=3

也就是说I到G共有path_num(I)= 1种方法,F到G共有path_num(G) = path_num(F) = 2种方法,一共1+2=3中方法。

最终算出step(G),path_num(G)

不停的迭代下去直至到达T。


核心代码: