我认为可以通过 DFS 和 BFS 的组合来完成。
在未加权图的原始 BFS 中,我们有一个不变量,即未探索的节点的距离与已探索的节点之间的距离更大或相等。
在我们的 BFS 中,对于每个节点,我们首先通过所有 0 加权边进行 DFS,标记距离,并将其标记为已探索。然后我们可以继续 BFS 中的其他节点。
Array Seen[] = false
Empty queue Q
E' = {(a, b) | (a, b) = 0 and (a, b) is of E}
DFS(V, E', u)
for each v is adjacent to u in E' // (u, v) has an edge weighted 0
if Seen[v] = false
v.dist = u.dist
DFS(V, E', v)
Seen[u] = true
Enqueue(Q, u)
BFS(V, E, source)
Enqueue(Q, source)
source.dist = 0
DFS(V, E', source)
while (Q is not empty)
u = Dequeue(Q)
for each v is adjacent to u in E
if Seen[v] = false
v.dist = u.dist + 1
Enqueue(Q, v)
Seen[u] = true
运行 BFS 后,它可以为您提供与节点源的最短距离。如果您只想要到单个节点的最短距离,只需在看到目标节点时终止。是的,它满足 O(V+E) 时间复杂度的要求。