2013-08-20 9 views
6

グラフの最小可能深度を見つけることが問題になります。これは、各ノードから最大深度を見つけてそれらのうちの最小限を返さなければならないことを意味します。明らかに、各ノードのシンプルなDFSがそのトリックを行いますが、非常に大きな入力で状況が狂ってしまうと、DFSは非効率的(時間制限)になります。私は、メモリ内で探索されているノードへの各リーフの距離を保つことを試みたが、それはあまり役に立たなかった。すべてのノードからグラフの深さを効率的に見つける

非常に大きなグラフの最小奥行きを効率的に見つける方法を教えてください。問題のグラフがのサイクルがないことは注目に値する。

+0

あなたは無向グラフの[グラフ中心](http://en.wikipedia.org/wiki/Graph_center)を探していますか? –

+0

@PeterdeRivazそうですね。 –

答えて

9

無向ツリーグラフのグラフセンター/センターにあなたを見つけるにできます

  1. は、すべてのリーフノードのOのリストを見つけるために、DFSを実行してください(n)を
  2. から、これらすべてのリーフノードを削除します新しいノードがリーフノードになる削除時グラフノート
  3. 繰り返しグラフが完全にアルゴリズムの最終段階で削除

ノード/ノードがグラフになり削除されるまで、ステップ2あなたの木の中心。

各ノードは一度削除されるため、このプロセス全体はO(n)で実行できます。あなたが探しているように見える何

+0

繰り返しの回数は戻り値ですか?右? –

+0

最後の段階で複数のノードが削除された場合、その答えは反復回数になります。しかし、最後の段階で1つのノードが削除された場合、その答えは反復回数-1になります。 (1回の反復でツリーA-Bが削除され、深さ1がありますが、ツリーAも1回の反復で削除されます) –

+0

何かがないか、削除される最後のノードが常にDFSのキーになりますか? – tumasgiu

0

は、あなたが以下のように木の直径を計算し、ツリーの任意のノードnため、findDiameter(n, null)として、それを呼び出すことができます直径/2です。あなたがする必要があるのは、隣人を超えるループである

public findDiameter(node n, node from) returns <depth, diameter> 

    // apply recursively on all children 
    foreach child in (neighbors(n) minus from) do 
     <de, di> = findDiameter(child, n) 

    // depth of this node is 1 more than max depth of children 
    depth = 1 + max(de) 

    // max diameter either uses this node, then it is 1 + the 2 largest depths 
    // or it does not use this node, then it's the max depth of the neighbors 
    diameter = max(max(di), 1 + max(de) + oneButLargest(de)) 

は最大直径と2つの最大深さを追跡します。

+0

私は[ここ](http://en.wikipedia.org/wiki/Eccentricity_(グラフ_理論)#Related_concepts)を読んで、 "グラフの直径"の定義から、これは私の問題を解決するかどうかは疑問です。これが私の問題とどう関係しているか説明してください。ありがとう。 –

+0

@OlayinkaSF樹木の直径「d」は、2つの葉の間の最長経路の長さである。そのパスの中間ノード「m」を考えてください( 'd'が偶数であるとします;' d'が奇数であれば、2つのノードがあります)。'm'からの最大深度は' ​​d/2'です(最長深度に沿って最大深度を見つけなければならない、あるいは矛盾があり、他のパスが長くなる)。他のすべてのノードについて、最大深さは少なくとも「d/2 + 1」(それを「m」を介して経路指定し、次に最長経路の端の1つに送る)である。したがって、 'm'はグラフ中心で、あなたが検索する値は' d/2'です。 –

関連する問題