グラフ内のすべてのエッジをトラバースし、繰り返しなしでエッジのコレクションを取得する必要があります。
私はDFSを使用し、次のようにコレクションにエッジを追加し続けます。すべてのエッジを効率的にトラバースする方法は?
procedure DFS(G,v):
label v as discovered
for all edges from v to w in G.adjacentEdges(v) do
{
addEdge(v,w); //get edges
if vertex w is not labeled as discovered then
recursively call DFS(G,w)
}
が、それはエッジの繰り返しを持っていないはずなので、私は 「addEdges」にいくつかのチェックを行う必要があります。
addEdges(v,w)
{
if either v or w is not in HashTble(nodes)/
{
add edge(v,w) to collection(edges)
add v and w to HashTble(nodes)
}
else
{ //both v and w in HashTble(nodes)
if edge(v,w) is not in collection(edges)
add edge(v,w) to collection(edges)
}
}
これが私のやり方です。問題は、グラフが非常に大きく、このグラフ 'addEdges'が時間を消費していることです。これは、コレクション内で何度かチェックインする必要があるためです。
もっと速くできる方法はありますか? ありがとうございます!
、あなたは二回エッジを通過することはありません(* vは標識されている場合、戻ります; *)。 – Holt
@Holt。もし私があなたが言うように動くのであれば、DFSがすべてのエッジを訪れるわけではないので、私はいくつかのエッジを見逃すかもしれません。私は以下の答えが私の問題を解決すると思います。 :) – arslan
これは基本的にあなたのコードと同じであるので、あなたは何も見逃すことはありません(私は間違っているか、私はそのような答えを提案していないでしょう...)。 – Holt