2017-01-14 8 views
0

私はDFSアルゴリズムを使用していて、各エッジを訪問したとマークしたいと考えています。ノードを探してそれをいくつかのセンチネルに置き換える方法がありますが、検索したノードに対応する値を格納すると、ルックアップ時間が長くなります。行列は多くの領域を消費します。そうするための最良のアルゴリズムは何ですか?グラフ内のエッジを訪問する

+0

エッジを訪問して記録する必要がありますか?エッジを2回繰り返すには、同じノードを2回通過する必要があります。訪問先のノードを追跡するのは簡単です。あなたは正確に何をしようとしていますか? –

+0

@ A.Sokol私は端を訪れているので、記録する必要があるので、もう一度それを訪れることはありませんが、このような場合には1 - > 2 && 2-> 1が存在します。私はエッジを訪問するので、私はそれらを格納する必要があります。 – idk

+0

あなたはそれに沿って印刷してみませんか? – CodingYoshi

答えて

0

頂点ペアのセットを維持するだけで済みます。例:Java HashMap<Pair<Vertex, Vertex>>。 Pythonでは、2要素タプルのSetがあります。

発見されたばかりの新しい頂点の子孫を列挙し、それらをDFSスタックに追加すると、エッジの訪問が発生します。再帰DFSを使用している場合は、各子孫に対して再帰呼び出しを行うようになります。スタックバージョンは次のとおりです:

dfs(graph) 
    visitedVertices = \emptyset 
    visitedEdges = \emptyset 
    // Try all vertices as search roots 
    for each vertex r in graph 
    push r onto empty stack 
    while notEmpty(stack) 
     u = pop stack 
     if u not in visitedVertices 
     add u to visitedVertices 
     foreach v such that u->v is in graph 
      add (u,v) to visitedEdges // Visit the edge 
      push v on stack 

これは、私はあなたがこれをしたい理由はわかりません。正しく実装されたDFSは、自然に各エッジを1回だけ横断します。上記のアルゴリズムを見て、これを自分自身に証明することができます。 (u,v)の訪問は、uが以前に訪れたことがない場合にのみ可能です。

おそらく、あなたは、検索の進行状況を見ているか、実際にあなたが訪問したときにエッジに他の情報を追加している他のスレッドがありますか?

+0

私はエッジをリダイレクトしてグラフのオイラー回路を作りたいと思っていて、Fleuryアルゴリズムは私の制約のために複雑すぎる(時間がかかる)、私はエッジを取り除き、ブリッジかどうかをチェックするためにdfsを再適用する余裕がありません。ノードを複数回訪問しようとすると失敗しますか? 1-> 2がマークされていれば、マークされたエッジではないが、それはエッジを生成し、無向であるため、エッジ2-> 1はまだ可能であるか? – idk

+0

@idk申し訳ありませんが、私はあなたが何を求めているのか理解できません。 – Gene

+0

エッジが再配置されていることを意味する歪みのあるオイラー回路があると、グラフオイラー回路を作るために間違った順序で配置されたエッジをリダイレクトすることによって、オイラー回路をもう一度作成します。 – idk

関連する問題