ツリーの直径を見つけるには、ツリーから任意のノードを取得できます。BFSを実行して、ツリーから最も遠いノードを見つけ、そのノードでBFSを実行します。 2番目のBFSからの最大距離が直径になります。
これを証明する方法はわかりませんか?ノードの数で誘導を使用してみましたが、ケースが多すぎます。
どんなアイデアでも大歓迎です...
最初のBFS xで見つかったエンドポイントを呼び出します。重要なステップは、この最初のステップで見つかったxが常に「機能する」ことを証明することです。つまり、これは常にいくつかの最長パスの一端にあります。 (一般に、複数の同じ最長パスが存在する可能性があることに注意してください。)これを確立できれば、xをルートとするBFSが、xから可能な限りいくつかのノードを見つけることは簡単です。最長経路。
ヒント:(逆に)2つの頂点uとvの間に長いパスがあり、どちらもxではないとします。
Uとvの間の一意のパス上に、最も高い(ルートに最も近い)頂点hがなければならないことに注意してください。 2つの可能性があります。hがBFSのルートからxへのパス上にあるか、そうでないかのいずれかです。どちらの場合でも、u-vパスのパスセグメントをxへのパスで置き換えることにより、u-vパスを少なくとも同じ長さにできることを示して、矛盾を示します。
[EDIT]実際には、2つのケースを個別に処理する必要はないかもしれません。しかし、多くの場合、構成をいくつか(または多く)のケースに分割し、それぞれを個別に処理する方が簡単です。ここで、hがBFSルートからxへのパス上にある場合は、処理が容易であり、他の場合の手掛かりになります。
[編集2]後でこれに戻ると、考慮する必要のある2つのケースは(i)uvパスがルートからxへのパスと交差する( some頂点y、必ずしもUVパスの最高点hにない); (ii)そうではない。それぞれのケースを証明するために、まだhが必要です。
練習します j_random_hacker's hint 。 _s, t
_を最遠のペアにします。 u
を任意の頂点とします。次のような回路図があります
_ u
|
|
|
x
/ \
/ \
/ \
s t ,
_
ここで、x
は_s, t, u
_のジャンクションです(つまり、これらの頂点間の3つのパスのそれぞれにある一意の頂点)。
v
がu
から最大限に離れた頂点であると仮定します。回路図が次のようになった場合
_ u
|
|
|
x v
/ \ /
/ *
/ \
s t ,
_
その後
_d(s, t) = d(s, x) + d(x, t) <= d(s, x) + d(x, v) = d(s, v),
_
d(u, t) = d(u, x) + d(x, t)
およびd(u, v) = d(u, x) + d(x, v)
であるため、不等式が成立します。 v
とs
の間ではなく、x
とx
の間にt
が接続する対称的なケースがあります。
他のケースは次のようになります
_ u
|
*---v
|
x
/ \
/ \
/ \
s t .
_
さて、
_d(u, s) <= d(u, v) <= d(u, x) + d(x, v)
d(u, t) <= d(u, v) <= d(u, x) + d(x, v)
d(s, t) = d(s, x) + d(x, t)
= d(u, s) + d(u, t) - 2 d(u, x)
<= 2 d(x, v)
2 d(s, t) <= d(s, t) + 2 d(x, v)
= d(s, x) + d(x, v) + d(v, x) + d(x, t)
= d(v, s) + d(v, t),
_
したがって、平均化引数によるmax(d(v, s), d(v, t)) >= d(s, t)
、およびv
は最大距離のペアに属します。
1:procedureTreeDiameter(T)
2:任意の頂点vを選択します。ここでv whereV
3:u = BFS(T、v)
4:t = BFS(T、u)
5:戻り距離(u、t)
結果:複雑さ= O(| V |)