我被赋予了以下问题作为一项任务,但这让我很困惑:
考虑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时访问所有节点,我应该如何形成不同的图形。
答案 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>}