問題羅区P3388のポイント(トップカット)カットソリューション

質問は、表面

    ポイントのプロパティをカット:
    カットポイントノードであれば、U、uおよびサブツリーサブツリーがある場合にのみ、U(反転側)の祖先の側に接続されていない場合。
 
  換言すれば、低いが[V]> = DFN [U]、uはuはポイントを切断し、すなわちノード復帰せずにサブピクチャエッジを表す場合、子ノードvである点Uについて、
 
#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
INTのN、M。
構造体littlestar {
     int型に、
    int型のNXT。
}星[ 400000 ]。
int型のヘッド[ 400000 ]、CNT;
ボイド追加(INT U、INT V)
{ 
    星[ ++ CNT] .TO = V。
    スター[CNT] .nxt = ヘッド[U]; 
    ヘッド[U] = CNT。
} 
int型 DFN [ 20000 ]、低[ 20000 ]。
int型NUM;
int型COの[ 20000 ];
 無効 Tarjan(INT U、int型FA)
{ 
    DFN [U]を =低[U]は++ = NUM;
     のためint型のI =ヘッド[U]; I; I = スター[I] .nxt) {
         int型 V = スター[I] .TO;
         IF(! {DFN [V])
            Tarjan(V、U); 
            低[U] = 分(低[U]、低[V]);
             IF(FA &&低[V ]> = DFN [U]){ 
                COの[U] = 1 ; //複数のエントリポイントのいくつかは、例えば、ステートメントを決定することができるので、ここでは、カット点の数をカウントしない、なお、菊図。
            } 
        } 
        他の IF(!V = FA)
        { 
            低い[U] = 分(低[U]、[V] DFN)。
        } 
    } 

} 
int型のmain()
{ 
    scanf関数(" %D%dの"、&​​N、&M)。
    以下のためにint型 I = 1 ; I <= M; iは++ ){
         int型Uを、V。
        scanf関数(" %d個の%d個"、&​​U&V); 
        (V、U)を追加します。
        (V、U)を追加。
    } 
    のためのint型 i = 1 ; iが<= N; iが++ ){
         場合tarjan(I、([i]のDFN!)0 ); 
    } 
    INT COL = 0 以下のためにint型 i = 1 ; iが<= N; iは++ ){
         場合(共[I]){
             ++ COLと、
        } 
    } 
    COUT << COL << ENDL。
    以下のためにint型 i = 1 ; iが<= N; iが++ ){
         場合(共[I]){ 
            COUT << I << "  " 
        } 
    } 
}

 

 

おすすめ

転載: www.cnblogs.com/kamimxr/p/11331332.html