複雑時間: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 = 1。X <= 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(1、0 ); 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 }