最短路径的BFS修改

时间:2015-04-26 22:49:23

标签: algorithm depth-first-search breadth-first-search

我被赋予了以下问题作为一项任务,但这让我很困惑:

  

考虑BFS算法。给出图G =(V,E)和起点   顶点s∈V,该算法计算每个顶点u∈V的值   d [u],它是最短路径上的长度(边数)   对你而言。此问题的目的是修改BFS算法   用于计算从s到每个顶点的最短路径数的类   G.

     

这可以分两步完成:

     

(a)首先在G上运行标准BFS,从s开始。解释如何使用此BFS的结果生成新的图G2 =(V 2,E2),   其中V 2⊆V和E2⊆E,这样G2中的每条路径都从s开始,   G是从S开始的最短路径,相反,每一个   从s开始的G中的最短路径是G2中的路径。

     

(b)解释如何取(a)部分的结果计算每个顶点u∈V,数量n [u],即G2中的路径数   从s到你。 (提示:这可以通过修改BFS来完成。)两者   您的算法应该在O(V + E)时间运行。

对于部分a,我不太确定如何使用BFS的结果来生成新的有向图。我不明白它应该以何种方式形成。我是否使用访问过的节点来形成新图表?在进行BFS时访问所有节点,我应该如何形成不同的图形。

1 个答案:

答案 0 :(得分:1)

问题(a)可以通过正常运行BFS来解决,但对于您在执行此操作时发现的每个边(u, v)shortest-path(u)+1 <= shortest-path(v)(无论v是否为(u, v)已访问过)然后G2(b)中的有向边。

此外,在执行此操作时,要解决n[v] += n[u],您应该增加n[u] = 0。最初,s除了n[s] = 1以外的所有人,from collections import deque def bfs(G, s): shortest = [float('+Inf')]*len(G) count = [0]*len(G) shortest[s] = 0 count[s] = 1 Q = deque([s]) while Q: u = Q.popleft() for v in G[u]: if not count[v]: Q.append(v) if shortest[u]+1 <= shortest[v]: shortest[v] = shortest[u]+1 count[v] += count[u] return count G = [ [1, 2, 3], [4], [4], [4], [] ] print bfs(G, 0)

以下是Python实现的示例:

ID: @{var fhirID = <processing for ID>; <a href='@routes.Users.fhirUserDetails(fhirID)'>fhirID</a>}