[合宿前2019 CSP-S] [CF1037D]有効BFS?

トピックへのリンク: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 }

 

おすすめ

転載: www.cnblogs.com/Xx-queue/p/11701164.html