BFS / DFSを使用して木の直径を見つけるアルゴリズム。なぜ機能するのですか?


28

このリンクは、BFS / DFSを使用して無向木の直径を見つけるためのアルゴリズムを提供します。要約:

グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。

なぜ機能するのですか?

このページ2には理由がありますが、混乱を招きます。証明の最初の部分を引用しています:

グラフ内のノードsでBFSを実行し、最後に検出されたノードuを記憶します。最後に検出されたノードvを思い出して、uからBFSを実行します。d(u、v)は木の直径です。

正しさ:d(a、b)が木の直径になるように、aとbを2つのノードとします。aからbへの一意のパスがあります。tをBFSによって検出されたそのパス上の最初のノードとします。sからuへのパスとaからbへのがエッジを共有しない場合、tからuへのパスにはsが含まれます。そうp1p2

d(t,u)d(s,u)

d(t,u)d(s,a)

....(さらに不等式が続きます..)

不平等は私には意味がありません。


リンクされた質問に引用が見つかりません。
ラファエル

1
ソリューションの「エッジを共有しない」を「頂点を共有しない」に置き換えてみてください。
ユヴァルフィルマス14年

DFSではなくBFSのみを使用しています。
サムネイル

回答:


11

クレームの証明のすべての部分は、無向のエッジを持つツリーの2つの重要な特性にかかっています。

  • 1-接続性(つまり、ツリー内の任意の2つのノード間に、正確に1つのパスがある)
  • どのノードもツリーのルートとして機能できます。

任意のツリーノード選択します。はノードであると仮定します。さらに、アルゴリズムが最初に始まるノード見つけ、次に始まるノード見つけると仮定します。wlog。アルゴリズムの最初の段階がならない限り、を保持する必要があることに注意してください。ことがわかります。U V V G su,vV(G)X S 、Y 、X 、D S U D S V D S X D S y x d x y =d(u,v)=diam(G)xsyxd(s,u)d(s,v)d(s,x)d(s,y)xd(x,y)=d(u,v)

関連するすべてのノードの最も一般的な構成は、次の擬似グラフィックで見ることができます(おそらくまたはまたは両方)。 s = z x ys=zuvs=zxy

(u)                                            (x)
  \                                            /
   \                                          /
    \                                        /
     ( z_uv )---------( s )----------( z_xy )
    /                                        \
   /                                          \
  /                                            \
(v)                                            (y)

私達はことを知っています:

  1. D U V < D I M G d(zuv,y)d(zuv,v)。それ以外の場合、は仮定と矛盾します。d(u,v)<diam(G)
  2. D U V < D I M G d(zuv,x)d(zuv,u)。それ以外の場合、は仮定と矛盾します。d(u,v)<diam(G)
  3. Xd(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)、それ以外の場合、アルゴリズムのステージ1は停止しました。x
  4. Yd(zxy,y)d(v,zuv)+d(zuv,zxy)、そうでなければ、アルゴリズムのステージ2は停止しません。y

1)および2)。d(u,v)=d(zuv,v)+d(zuv,u)d(zuv,x)+d(zuv,y)=d(x,y)+2d(zuv,zxy)d(x,y)

3)および4)同等。d(zxy,y)+d(s,zxy)+d(zxy,x)d(s,zuv)+d(zuv,u)+d(v,zuv)+d(zuv,zxy)d(x,y)=d(zxy,y)+d(zxy,x)2d(s,zuv)+d(v,zuv)+d(u,zuv)d(u,v)

したがって、です。d(u,v)=d(x,y)

代替構成のためのアナログ証明

                 (u)                          (x)
                   \                          /
                    \                        /
                     \                      /
     ( s )---------( z_uv )----------( z_xy )
                     /                      \
                    /                        \
                   /                          \
                 (v)                          (y)

そして

                          (x)        (u)  
                          /            \  
                         /              \ 
                        /                \
     ( s )---------( z_xy )----------( z_uv )
                        \                /          
                         \              /           
                          \            /            
                          (y)        (v)            

これらはすべて可能な構成です。特に、アルゴリズムのステージ1の結果によるおよびステージ2が原因Y P のT H X U Y P のT H X V xpath(s,u),xpath(s,v)ypath(x,u),ypath(x,v)


(1)最初のグラフィックに関して、sからxへのパスは、BFSによって生成されたツリー上に存在するため、常に頂点uとvが何らかの順序で含まれていてはなりませんか?(2)不等式がどのように得られるかを明確にできますか?(3)sから始まるBFSとxから始まるBFSにはパス上のどこかにu、vが含まれるため、グラフィックはリンクimgur.com/jQ94erYに示されているとおりであると考えられます。あなたが提供した推論はここにどのように適用されますか?
カレージ14年

@curryageは、ツリーが与えられ、bfsによって構築されていないことに注意してください!具体的な回答:広告1)いいえ。エッジに任意の多くのノードを追加し、エッジに正確に1つのノード追加することにより、グラフィックス(1)のツリーの改良を想像してください。最初の段階のbfsはxで終わります。広告2)どの不平等が不明確か?は常にグラフの直径の長さのパスであると仮定しています。Gは1接続であるため、これは明確に定義されています。ad 3)no:3.1以外の2つのノード間に複数のパスがあるため、グラフはツリーではありません。...z x yx u v d i a g G s y (s,zxy)(zxy,x)(u,v)diag(G)(s,y)
コラプサー14年

@curryage ... 3.2 ; これは仮定によりとして不可能であり、グラフの直径は任意の2つのノード間の最大最小距離です。ツリーの場合、任意の2つのノード間に正確に1つのパスがあるため、定義は「任意の2つのノード間の最大距離」に短縮されます。d u v = d i a m G d(x,y)>d(u,v)d(u,v)=diam(G)
コラプサー14年

9

背後にある直感は非常に理解しやすいです。特定のツリー内の任意の2つのノード間に存在する最長パスを見つける必要があるとします。

いくつかの図を描いた後、2つのリーフノード(リンクされているエッジが1つだけのノード)の間で常に最長パスが発生することがわかります。これは、2つのノード間に最長パスがあり、2つのノードのいずれかまたは両方がリーフノードでない場合、パスを延長してより長いパスを取得できるという矛盾によっても証明できます。

そのため、まず、どのノードがリーフノードであるかを確認し、次にリーフノードの1つからBFSを起動して、最も遠いノードを取得します。

最初にどのノードがリーフノードであるかを見つける代わりに、ランダムノードからBFSを開始し、次にどのノードがそれから最も遠いかを確認します。最も遠いノードをxとします。xがリーフノードであることは明らかです。ここで、xからBFSを起動し、そこから最も遠いノードをチェックすると、答えが得られます。

しかし、xが最大パスの終点になるという保証は何ですか?

例で見てみましょう:

       1   
    / /\ \
   6 2  4 8
         \ \
          5 9
           \
            7

6からBFSを開始したとします。6から最大距離にあるノードはノード7です。BFSを使用すると、このノードを取得できます。次に、ノード7からBFSにスターを付けて、最大距離でノード9を取得します。ノード7からノード9へのパスは、明らかに最も長いパスです。

ノード6から開始したBFSが最大距離のノードとして2を与えた場合はどうなりますか。その後、2からBFSを実行すると、最大距離のノードとして7が得られ、最長パスは長さ4で2-> 1-> 4-> 5-> 7になりますが、実際の最長パス長は5です。これは、ノード6からのBFSが最大距離でノード2をノードとして決して与えないために起こります。

それが役に立てば幸いです。


1
それは簡単で明確な説明です!ありがとう:)
anekix

4

以下は、元の質問でより密接にリンクされたMITソリューションセットに続く証明です。わかりやすくするために、比較をより簡単に行えるように、同じ表記法を使用します。

パス上のと間の距離が直径になるように2つの頂点とがとします。例えば、距離はツリーの任意の2点間の可能な最大距離です。ノードもあるとします(場合、最初のBFSがを取得し、2番目がに戻るため、スキームが機能することは明らかです)。また、ようなノードがあるとします。ababp(a,b)d(a,b)sa,bs=abud(s,u)=maxxd(s,x)

補題0:とはどちらもリーフノードです。ab

証明:リーフノードではない場合、直径をと矛盾させて、エンドポイントをリーフノードに拡張することにより増やすことができます。d(a,b)d(a,b)

補題1:。max[d(s,a),d(s,b)]=d(s,u)

証明:矛盾のために、と両方が厳密によりも小さいと仮定します。次の2つのケースを検討します。d(s,a)d(s,b)d(s,u)

ケース1:パス頂点が含まれていませ。この場合、を直径にすることはできません。理由を確認するために、をまで距離が最小の上の一意の頂点とする。次に、、。同様に、ます。これは、直径であると矛盾します。p(a,b)sd(a,b)tp(a,b)sd(a,u)=d(a,t)+d(t,s)+d(s,u)>d(a,b)=d(a,t)+d(t,b)d(s,u)>d(s,b)=d(s,t)+d(t,b)>d(t,b)d(b,u)>d(a,b)d(a,b)

ケース2:パスに頂点が含まれています。この場合、再び、いくつかの頂点に対してため、直径にすることはできませんように、両方の及びはより大きくなります。p(a,b)sd(a,b) ud(s,u)=maxxd(s,x)d(a,u)d(b,u)d(a,b)

補題1は、最初のBFSの最後に検出された頂点で2番目の幅優先探索を開始する理由を示しています。場合から最大可能距離を持つユニークな頂点であるは、補題1により、それがなければならない距離を有するいくつかのパスのエンドポイントの1つの直径に等しくなるよう、ひいてはと第二BFSルートとしては明確に認めます直径。一方、であるような頂点少なくとも1つある場合、直径はことがわかります。、2番目のBFSをまたはで開始するかどうかは関係ありません。u s u v d s v = d s u d auusuvd(s,v)=d(s,u)d(a,b)=2d(s,u)uv


驚くばかり。この回答を投稿していただきありがとうございます。この回答に賛成票がなかったことに驚いています。
ゼファー

0

最初にランダムノードからDFSを実行し、次にツリーの直径がそのDFSサブツリー内のノードの最も深いリーフ間のパスになります。 ここに画像の説明を入力してください


4
なぜこれが機能するのですか?
ユヴァルフィルマス

0

BFSの定義により、探索される各ノードの(開始ノードからの)距離は、探索される前のノードの距離に等しいか、1だけ大きくなります。したがって、BFSによって探索される最後のノードは、ノード。

したがって、任意のノードピック」に二回量BFSを使用するアルゴリズム、ノード検索から最も遠い(最後のノードから出発しBFSによって見出さ)ノードの検索から最も遠い(最後のノードから出発しBFSによって発見)。 "、したがって、互いから最大距離の2つのノードを見つけます。xaxxbaa


1
直感で答えてくれてありがとう。ただし、最後の文の「したがって」は明らかではありません。なぜそれが続くのですか?から最も遠いノードが、互いに最大距離にある2つのノードの1つでなければならないのはなぜですか?それには何らかの証拠が必要なようです。x
DW

そのような証明をどのように構築するのか分かりません。私は逆が直感的に正しいと感じています:2つのノードが互いに最大距離にある場合、任意のノードについて、2つのうちの1つはそれから可能な限り最大の距離にあります。
Extrarius

「直感的に正しい」という主張は、一般的なグラフでは一般的に真実ではありません。cs.stackexchange.com/a/213/755のグラフを参照して、ノードからBFSを開始することを想像してください(つまり、)。それが選択されます、ノード発見から最大距離で、それは互いから最大距離の二つのノードを見つけられません。したがって、主張された文は、真の場合、一般的なグラフには当てはまらない木の特別なプロパティに依存する必要があります。vx=va=uba
DW

はい。ただし、この質問は無向木を指定しています。これは、私が直観しているコンテキストです。サイクルと有向エッジを禁止すると、多くのグラフの問題を非常に簡単に推論できます。
Extrarius

0

知っておくべき重要なことの1つは、ツリーが常に平面であるということです。つまり、ツリーは平面上に配置できるため、通常の2次元思考が機能することがよくあります。この場合、アルゴリズムはどこからでも開始し、できるだけ遠くに行くように指示します。そのポイントからあなたがそのポイントから離れることができる限りまでの距離は、木の中で最も長い距離であり、したがって直径です。

この方法は、島を完全に囲む最小の円の直径として定義した場合、実際の物理的な島の直径を見つけるためにも機能します。


0

@ op、PDFでのケースの定義方法は少しずれている場合があります。

私は2つの場合があると思う:

  1. p1はと交差しません。つまり、パスと間に共通の頂点はありません。この場合、から始まる最初のBFSによって発見されたの最初のノードとしてを定義します。p2p1p2tp2s

  2. p1とは、少なくとも1つの共通の頂点があります。この場合、を、同じく上にある最初のBFSによって発見された上の最初のノードとして定義します。p2tp2p1

PDFの残りの証拠が続きます。

この定義により、OPで示される図はケース2に分類されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.