図機能しなくてもツリーのために、私たちはrootとして任意のノードを選択することができます。図ツリーは、すべての可能なツリーのようになることができ、ツリーの最小の高さを有するツリーは、最小の高さと呼ばれます。そのようなマップを考えると、その根に木とリターンの最小の高さのすべてを見つけるために、関数を記述します。
フォーマット
この図備えるNノード、nは0標識 - 1。側縁部に所定数nと空きリスト(各側は、対タグです)。
あなたは側の端に表示されます重複が存在しないと仮定することができます。すべてのエッジが無向エッジ、[0、1]、[1,0]であるので同じであるので、エッジで同時に発生しません。
例1:
入力:N = 4、エッジ= [1,0]、[1,2]、[1,3]
0
|
1
/ \
2 3
出力:[1]
例2:
入力:N = 6、エッジ= [0,3]、[1,3]、[2,3]、[4,3]、[5,4]
0 1 2
\ | /
3
|
4
|
5
出力:[3、4]
説明:
ツリーの定義によれば、木は、任意の2つの頂点が一つのパスによって接続されている無向グラフです。換言すれば、図との通信のない単純なループはツリーです。
木の高さは、上側ダウンルートノードとリーフノードとの間の最長パスの数です。
出典:滞在ボタン(LeetCode)
リンクします。https://leetcode-cn.com/problems/minimum-height-trees
すべてのネットワークからの控除が著作権を保有。商業転載は、ソースを明記してください許可公式、非商用の転載をご連絡ください。
最初の試みは、ルートとして各点の高さを計算し、次いで最小値を見つけるために、深さ優先アルゴリズムを使用することで、結果は大きすぎる時間複雑です。(私はまた、どのくらい知ってほしいです)
第二は、複数のリーフノードは、即ち、1度点を除去することができます。すべてのポイントの除去が削除された後に発見された場合には、除去点が答えです。しかし、サブリーフノードにつながる同時除去を、判断しないように注意して、同じ時間を削除するたびに同じラウンドで除去されます。最初の除去と再統一枠消しを記録すべきポイントが削除される必要があります。
クラスのソリューション{ パブリック: intは訪問[ 100000 ]、度[ 100000 ]。 / * INT DFS(INT T、INT heigh、ベクトル<ベクトル<INT >>&エッジ){ int型の最大値= -1、O、I。 ための式(I 0 =; I <edges.size(); iが++){ IF(エッジ[I] [0] == T &&訪問[縁[I] [1]] == 0){ 訪問[縁[I] [ 1] = 1。 O = DFS(エッジ[I] [1]、heigh + 1、エッジ)。 IF(O> MAX)最大= O。 訪問[縁[I] [1] = 0; }そうであれば(エッジ[I] [1] == T &&訪問[縁[I] [0]] == 0){ 訪問[縁[I] [0] = 1; O = DFS(エッジ[I] [0]、heigh + 1、エッジ)。 IF(O> MAX)最大= O。 訪問[縁[I] [0] = 0; } } (最大== - 1)であれば{ 戻りheigh。 } 最大返します。 } int型の高さ(int型K、INT nは、ベクトル<ベクトル<INT >>&エッジ){ ためには、(i = 0; I <N; I ++){ 訪問[I] = 0; } } * / / * ベクトル<整数> findMinHeightTrees(整数nは、ベクトル<ベクトル<INT >>&エッジ){ int型I、II。 以下のために(私は= 0; iは<N; I ++){ 訪問[I] = 0; } ベクトル<整数> RES。 INT R、分= 10000000。 R = DFS(I、0、エッジ)。 (iについては、= 0、I <N。 訪問[I] = 1。 IF(R <分){ res.clear()。 res.push_back(I); 分= R。 }そうであれば(R ==分){ res.push_back(I)。 } // COUT << I <<」「<< R << ENDL。 訪問した[I] = 0; } RESを返します。 } * / ベクター < INT > findMinHeightTrees(整数 nは、ベクトル<ベクトル< INT >>&エッジ){ int型のI。 int型ライブ[N]; ための式(I = 0、I <N。 度[I] = 0 ; ライブ[I] = 1 ; } のためには、(iは= 0 ; I <edges.size(); I ++ ){ 度[縁[I] [ 0 ] ++ ; DEG [縁[I] [ 1 ] ++ ; } ベクトル < INT > RES。 INT、T = 1、J、Z = N。 一方、(Z> 0 ){ res.clear()。 ため、私は=(0、I <N; I ++){ 場合(DEG [I] <= T &&ライブ[I] == 1 ){ res.push_back(I)。 } } のためには、式(I = 0、I <res.size(); I ++ ){ ため(J = 0 ; J <edges.size(); J ++ ){ 場合(エッジ[j] [ 0 ] == RES [I ] &&ライブ[縁[J] [ 1 ]] == 1 ){ 度[縁[J] [ 1 ] - 。 } であれば(エッジ[J] [ 1] == RES [I] &&ライブ[縁[j] [ 0 ]] == 1 ){ 度[縁[j] [ 0 ]] - 。 } } Z - 。 ライブ[RES [I]] = 0 ; // coutの<< "T =" <<トン<< " "<<私は<<""移動\ nは、 } } 戻りRES。 } }。