強連結グラフ、Tarjan - HDU-1269

トピックリンク

タイトルの意味

グラフを解析することを強く接続されていないグラフは、すなわち双方向チャネルは、任意の2点間に存在します

トピック分析

Tarjanは、この図の強連結グラフで計算することができますどのように多く、そうでない場合は、もちろん1出力No

それが1である場合にのみ、強くグラフに接続されているすべての点を見つけるために、この図は、DFNする必要がある強連結グラフ、[X] ==低[X]は説明できない強連結部分グラフを示します彼らのxへのすべてのポイント、そして最終的には同様の互いに素セットこのすべてこの数字を決定することを強くイトゥリでの接続ポイントではありません

トピックコード

書式#include <iostreamの> 
書式#include <stdio.hに> 
する#include < 文字列の.h>
 使用して 名前空間はstdを、
typedefの長い 長いLL。
const  int型 MAXN = 1E5 + 7 const  int型 MAXM = 1E4 + 7 構造体の縁{
     INT 次へ。
} E [MAXN]。
INTのTOT、CNT、上部、SCC、N、M、B。
int型のヘッド[MAXM]、instack [MAXM]、[MAXM] DFN、低[MAXM]、ST [MAXM]、根[MAXM]。
ボイド追加(INT U、INT V){ 
    E [TOT] .TO =V; 
    E [TOT] .next = 頭部[U]。
    ヘッド[U]は ++ TOTを= 
} 
ボイドのinit(){ 
    TOT = CNT =人気= SCC = 0 
    memsetの(頭、 - 1はsizeof (ヘッド))。
    memset(instack、0はsizeof (instack))。
    memset(DFN、0はsizeof (DFN))。
} 
ボイド Tarjan(int型X){ 
    instack [X] = 1 
    低[X] =のDFN [X] = ++ CNT。
    ST [ ++トップ] =のX。
    以下のためにint型 - ;!I = I =ヘッド[X] 1 ; I = {E [I] .next)
         INT Y = E [I] .TO。
        もし(!DFN [Y]){ 
            Tarjan(Y)。
            低[X] = 分(低[x]は、低[Y])。
        } 
        そう であれば(instack [Y])低[X] = 分(DFN [Y]、[x]は低いです)。
    } 
    instack [X] = 0 もし(低[X] == DFN [X]){
         行う{ 
            ルート[ST [トップ - ] =のXと、
        } ながら(ST [トップ+ 1 ] =!X)。
        SCC ++ ; 
    } 
} 
int型のmain(){
     一方(のscanf(" %d個の%のD "、&​​N、&M)){
         場合(N == 0 && m個の== 0戻り 0 ; 
        その中に(); 
        int型 I = 1 ; I <= M Iは++ ){ 
            scanf関数(" %D%D "、&​​、&B)。
            追加(A、B)。
        } 
        Tarjan(1 )。
        以下のためのint型 I = 1;私は++; iが<= Nであれば!(ルート[I] = 1)SCC = 2 もし(SCC == 1)printfの(" はい\ N " );
        のprintf(" ノー\ nを" ); 
    } 
}

 

おすすめ

転載: www.cnblogs.com/helman/p/11285126.html