ポイントのプロパティをカット:
カットポイントノードであれば、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 << " " 。 } } }