タイトル説明
所与N- 、Nポイント、mは図のカット点を求めて、図Mにフリーエッジを。
入力形式
入力の最初の行のn、M N- 、M
次のm個のm行の各入力X、Y X 、Yを表しX にXをY エッジが存在するY
出力フォーマット
最初の出力行数のカットポイント
スペースで区切られた多数の小さなから出力ノードに応じて第二のラインノード
サンプル入力と出力
エントリー
6 7 1 2 1 3 1 4 2 5 3 5 4 5 5 6
輸出
1 5
説明/ヒント
すべてのデータのためのN- ≤ 2 0 0 0 0、m個の≤ 1 0 0 0 0 0
番号のポイント>である<= 0 N-
tarjan図面は必ずしもユニコムではありません
1の#include <ビット/ STDC ++ H.> 2 使用して 名前空間STD; 3 4 CONSTの 整数 N = 1E5 + 5 ; 5 int型N-、M、DEP; 6 INT DFN [N]、低[N]; 7ベクトル< INT > G [N]; /// 隣接テーブルに格納さ 8。 SET < INT > ST; /// メモリカットポイント 9。 10 空隙 Tarjan(INT U、INT 父){ 11。 DFN [U] =低[U] = ++ DEP 、 12である INT子供= 0 。 13である ため(INT I = 0、IはG [U]を<.size();私は++ ){ 14 のint V = G [U] [I]、 15 IF(!DFNは[V]){ /// 点ではありません訪問 16 ; Tarjan(V、父) 。17 低[U] = 分(低[U]、低[V]); 18で IF(U ==父){ /// ルートサブツリー量統計 19。 子供++ 。 20は } 21が 他{ 22は IF(DFN [U] <= 低[V]) 23が st.insert(U); 24 } 25 } 26は、 他の低[U] = ;分(低[U]、DFN [V]) 27 } 28 IF(Uは== &&子供の父> = 2)/// ルートノードとサブツリーの数が1より大きい場合、切断されます点 29 st.insert(U); 30 } 31は、 32 INT メイン(){ 33は scanfの(" %のD%のD "、およびN-、&; M) 34は 、一方(M-- ){ 35 のint ; X、Y 36 scanfの(" %のD%のD "、およびX&Y); 37 [ G [X] .push_back(Y)。/// 無向グラフ、デポジット双方向エッジ 38である G [Y] .push_back(X); 39 } 40 のために(INT I = 0 ;私は<N-; I ++は){ 41は DEP = 0 ; // 図面は必ずしも通信されません、 0に設定された各 42で IF(!{DFN〔I〕) 43は、 Tarjan(I、I); 44で } 45 } 46である のprintf(" %d個の\ N- " 、st.size()); 47 INTフラッグ=で0 。 48 用(SET < int型> ::イテレータはst.beginを()=;!それ= st.end();それ++ ){ 49 であれば(フラグ)のprintf(" " ); 50 他フラグ= 1 。 51 のprintf(" %dの"、* IT)。 52 } 53 のprintf(" の\ n " ); 54 }