羅区P3388 [テンプレート]のカットポイント(Tarjan)

タイトル説明

所与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 }

 

おすすめ

転載: www.cnblogs.com/ChangeG1824/p/11421255.html