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)時間の複雑さの要件を満たしています。
正直な回答ありがとうございます。しかし、私が必要とするのは最短経路この答えでどこを見つけることができますか?ここで頂点の "dist"パラメタは実際にはウェイトですか? – AtsrA
@AtsrAその 'dist'はパスに沿ったすべてのエッジのウェイトの合計を与えます。 – HenryLee
ありがとう、私はこの考えがうまくいくと思う。 – AtsrA