DFSツリーのカット訴求ポイントの問題

複雑時間:O(nは形而上学)は短いではありません

コードの実装(良い悩み、紫と青のテーマのタイトル

  1の#include <iostreamの>
   2の#include < ストリング・H>
   3の#include <アルゴリズム>
   4の#include <ベクトル>
   5の#include <地図>
   6の#include <ビットセット>
   7の#include < 設定 >
   8の#include < ストリング >
   9  の#if!定義(_WIN32)
 10の#include <ビット/ STDC ++ H>
 11  #endifの // 定義(_WIN32)!
12  の#define LL長い長い
 13  の#define DDダブル
 14  使って 名前空間STD。
15  int型N、M。
16  int型のTOT;
17の LLのANS;
18  構造体端部
 19  {
 20      ブールT。
21      ブールフラグ。
22      int型へ。
23      のint NUM;
24      int型の次。
25 } E [ 500005 ]。
26  構造体ノード
 27  {
 28      のint 息子。
29      ブールフラグ。
30      int型F;
31      int型ヘッド。
32     int型D;
33      INT 深いです。
34 } P [ 100086 ]。
35  INT VIS [ 100086 ]。
36  ボイド追加(int型のx、int型のY)
 37  {
 38      TOT ++ 39      E [TOT] .TO = Y。
40      E [TOT] .next = P [X] .head。
41      P [X] .head = TOT。
42  }
 43  ブールチェック(INT X)
 44  {
 45      のためにINT私は、pを= [X] .head。私; I = E [I] .next)
 46      {
 47          であれば(E [I] .flag &&!E [I] .T)
 48          {
 49              INT =にE [I] .TO。
50              であれば((P .D <へ]!P [X] .deep))
 51                  リターン 0 52          }
 53      }
 54      リターン 1 55  }
 56の 空隙 DFS(int型のx、int型F)
 57  {
 58      VIS [X] = 1 59     P [X] .deep = P [F] .deep + 1 60      P [X] .D = P [X] .deep。
61      のためには、int型 [X] .head I = Pと、私は、I = E [I] .next)
 62      {
 63          INT =にE [I] .TO。
64          であれば(!VIS [に対して])
 65          {
 66              P [X] .son ++ 67              .F =の[に対する] P X;
68              E [I] .flag = 1 69の             DFS(X、へ)。
70          }
 71      }
 72  }
73  ボイドのinit(INT X)
 74  {
 75      のためにint型 [X] .head I = Pと、私は、I = E [I] .next)
 76      {
 77          INT =にE [I] .TO。
78          もし(E [I] .flag &&!E [i]は.T)
 79          {
 80              のinit()が、
81              P [X] .D = 分(P [X] .D、P .D [します])。
82          }
 83      }
 84  }
 85  空隙ワーク()
 86  {
 87      のためにINTX = 1X <= N。X ++ 88      {
 89          であれば(x == 1 90          {
 91              であれば(P [X] .son <= 1 92                  P [X] .flag = 1 93          }
 94          他の 場合(P [X] .son == 0 95          {
 96              P [X] .flag = 1 97          }
 98          
99          {
 100              であれば(チェック(X))
 101                 P [X] .flag = 1 102          }
 103      }
 104  }
 105  INT メイン()
 106  {
 107      CIN >> N >> M。
108      のためには、int型 I = 1 ; I <= M; iは++ 109      {
 110          INT X、Y。
111          CIN >> X >> Y。
112          追加(X、Y)
113          追加(Y、X)。
114      }
 115      DFS(10 );
116     以下のためにint型 i = 1 ; iが<= N; iは++ 117      {
 118          のためのINT J = P [i]の.head; J; J = E [J] .next)
 119          {
 120              INT =にE [J] 。に;
121              もし(E [J] .flag &&へ=!P [i]が.F)
 122              {
 123                  P [i]は.D = 分(P [i]の.D、P .deep [します])。
124              }
 125              そう であれば(==するPを[I] .F)
 126              {
 127                  E [J] .T = 1;
128              }
 129          }
 130      }
 131      INIT(1 )。
132      ワーク()。
133      のためのint型 i = 1 ; iが++; iが<= N 134      {
 135を         場合(!P [i]は.flag)
 136              COUT << I << ENDL。
137      }
 138      戻り 0 ;
139 }

 

おすすめ

転載: www.cnblogs.com/HNFOX/p/11273855.html