tarjanアルゴリズム - 最大接続成分(テンプレート)

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]); 
}

 

おすすめ

転載: www.cnblogs.com/jjl0229/p/11305068.html