幅優先探索のLeetcode(BFS)テーマ別-133。図クローン(クローングラフ)
BFS詳細なエントリ:幅優先探索(BFS)テーマ別-429トラバーサル順序N-ツリー(N進ツリー上位のオーダートラバーサルのLeetcode )。
無向与えられた通信ノードの参考図、図返し深いコピー(クローン)。グラフの各ノードは、その値が含まれている val
(Int
)、及びその近隣のリストを(list[Node]
)。
例:
入力: { "$ ID": "1" 、 "近隣":[{ "$ ID": "2"、 "近隣":[{ "$ REF"}、{ "$ ID"" 1 ":" 3 ""近隣":[ {" $ refを":" 2 "}、{" $番号":" 4 ""近隣":[{" $ refを":" 3 "}、{" $ refを" : "1"}]、 "ヴァル":4}]、 "ヴァル":3}]、 "ヴァル":2}、{ "$ refを": "4"}]、 "ヴァル":1} 説明: ノード2および4:ノード1が1の値であり、これは、2つのネイバーを有しています。 ノード1および3:ノード2の値は2であり、これは、2つのネイバーを有しています。 ノード2と4:3のノード3の値であり、これは、2つのネイバーを有しています。 ノード1及び3:4は、ノード4の値であり、これは、2つのネイバーを有しています。
ヒント:
- 1と100の間のノード。
- 無向グラフである単純なグラフないループが存在しないので、重複する図側が存在しないことを意味します。
- グラフは無向であるとしてノード場合、 pは ノードである q個の 隣接ノード Qは 、ノードのなければならない Pの ネイバー。
- コピーされたノードは、リターンクローン図への参照として与えられなければなりません。
グラフを考えると、このグラフのコピーは、コピーを返します。
次のようにアイデアは以下のとおりです。
1、新マップ、古いノードを格納するためのキー、値のための新しいストレージノード
2、ノードがキューに参加し始め、BFSに始まりました
3、BFS
- ノードの一時を外し、nはすべての彼の隣人をトラバース
- 隣人がnコピーされているかどうかを確認するために、マップをチェック
- nは近隣のコピーではない場合、コピーは、追加キューノードbを終えました
- 一時隣接リストリスト外、リストの隣人の成功をコピーする上記の工程の追加
- 第三のステップに戻り、キューが空にバウンスです
/ * //ノードの定義。 クラスノード{ 公共のint valの; 公共の一覧<ノード>隣人。 パブリック・ノード(){} パブリック・ノード(INT _val、リストの<node> _neighbors){ ヴァル= _val。 隣人= _neighbors。 } }。 * / クラスソリューション{ パブリックノードcloneGraph(ノードノード){ 場合(ノード== NULL)戻りノード。 キュー <ノード>キュー= 新しい LinkedListは<> (); 地図 <ノード、ノード>マップ= 新しいのHashMap <> =(); ノードANS新しいノード(node.val、新しいのArrayList <> ()); map.put(ノード、ANS)。 queue.offer(ノード)。 一方、(!queue.isEmpty()){ ノードTEMP = queue.poll()。 用(ノードNB:temp.neighbors){ 場合(!map.containsKey(NB)){ map.put(NB、新しいノード(nb.val、新しいのArrayList <> ())); queue.offer(NB)。 } map.get(TEMP).neighbors.add(map.get(NB))。 } } 戻りANS。 } }