トピックへのリンク:https://www.luogu.org/problem/CF1037D
比較的簡単な一人の被験者は、直接シミュレーションプロセスのBFSツリーは友達になることができます。
ここでブロガーは、私たちが見ることができます魔法の方法を使用しました。
各ノードの息子の数、およびDFSと各ノードの父を探し出します。
再利用キューはプロセスに関する直接、シミュレーションを維持し、各ポイントのために、現在のノードの息子の数が前に出て検索満たしているかを決定、
そして、それを修正して、キュー、直接判定エラーのエラーに挿入し、彼の父が正しいか判断します。
少し遅いが、それはそれを行うには良い方法でしょう!BFSシーケンスの性質に主に関連する使用。
詳細コードを参照してください。
1つの#include <ビット/ STDC ++ H> 2 の#define N 200000 + 5 3 使用して 名前空間STDを、 4 int型N、フラグ、VIS [N]、息子[N]、FA [N]。 5ベクター< INT > エッジ[N]。 6キュー< 整数 > Q; 7つの ボイド DFS(INT U) 8 { 9 VIS [U] = 1 。 10 のために(int型 I = 0 ; I <エッジ[U] .size(); iが++ ) 11 { 12 INT今=エッジ[U] [I]。 13 であれば(!VIS [今]) 14 { 15 VIS [今] = 1 。 16の FA [今] = U。 17 息子[U] ++ ; 18の DFS(今)。 19 } 20 } 21 } 22 のint main()の 23 { 24 のscanf(" %d個"、&N) 25 のために(int型 i = 1 ; iがN <; Iは++ ) 26 { 27 int型のU、V; 28 のscanf(" %D%dの"、&U、およびV)。 29 エッジ[U] .push_back(V)。 30 エッジ[V] .push_back(U)。 31 } 32の DFS(1 )。 33 のint ; 34 のscanf(" %dの"、&A )。 35 であれば(!= 1)フラグ= 1 。 36 q.push(A)。 37 のmemset(VIS、0、はsizeof (VIS))。 38 VIS [A] =1 ; 39 ながら(!q.empty()) 40 { 41 INT今= q.front()。 42 q.pop()。 43 int型 CNT = 息子[今]。 44 のためには、(int型 i = 1 ; iが= CNTを<; Iは++ ) 45 { 46 のscanf(" %dの"、&A )。 47 であれば(VIS [A]) 48 { 49 フラグ= 1 。 50 続け; 51 } 52 他の 53 { 54 VIS [A] = 1 。 55 q.push(A)。 56 であれば(FA [A] =今!)フラグ= 1 。 57 } 58 } 59 } 60 であれば(フラグ)のprintf(" なし" )。 61 他のprintf(" はい" ); 62 リターン 0 ; 63 }