int型スタック[MAXN]、低[MAXN]、[MAXN] DFN、inStackは[MAXN]、[MAXN]属しています。 int型今、CNT。// 今:时间戳、CNT强连通的个数 ベクトル< INT > G [MAXN]。 スタック < int型 > S; 無効のinit(){ 今 = CNT = 0 。 memset(inStack、0、はsizeof (inStack))。 memsetの(、所属0、はsizeof )所属(); memset(DFN、0、はsizeof (DFN))。 memsetの(低い、0、はsizeof (低))。 以下のために(int型 i = 0 ; I <MAXN iは++ Gを[I] .clear())。 } ボイド tarjan(INT U){ // 打上标记、入栈 低い[U] =のDFN [U] = ++ 今。 s.push(U)。 inStack [U] = 1 。 以下のために(int型 i = 0 ; I <(INT)G [U] .size(); ++ I){ int型、V = G [U] [I]。 もし {(DFN [V]!)// 未访问过 tarjan(V); 低[U] =分(低[U]、[V]低いです)。//低、DFN(v)は、それがあってもよい最小 } 他 IF(inStack [V]){ // 、スタックはまだ訪問 低[U] =分(低[U]、DFN [V]); // DFN(v)は最小値を検索する } } // バックを、現在のノードのDFN =低いスタックが強連結成分が形成表す場合 IF(DFN [U] == 低[U]){ ++ CNT; // カウントA番号 INT トップ、 一方(!s.top()= U){ トップ = s.top(); s.pop(); 属する[トップ] = CNT; inStack [トップ] = 0 ; } トップ = s.top(); [トップ]属する = CNT; // レコード所属各点 s.popを(); } } のために(int型私は= 1 ; I <= N; Iは++){ // Tarjan時間は、すべての点上に配置されなくてもよい IF(!Tarjan(I)DFN [I]); }