Tarjanについて

私は実際に豚の脳すごいです

姉妹校はすべてに約ある私が食べています

瞬間

今日、私はそれを書き留めた方が良いと思い、少し見直し

結局のところ、私の記憶

冬の風のように

だけでなく、ブラシのブラシも達人を吹きます

 

カット点と切刃(ブリッジ)について:

カットポイント:図はそれを穿刺しても、後に非通信側になるために

切削条件のポイントになることができる:ルートノードの1、Uの祖先の縁に戻っ指していない二つまたはサブツリーの非ルート非リーフノードのためのより多くのサブツリー2.があります

刃先:このエッジの後に削除は、図に通信できないとなります。

エッジ条件を切断することになる:(U、V)と木の側低い[V]> DFN [U ] 理由:Vは、このエッジによって接続され、Uするノードを表し

例:羅区P3388 [テンプレート]ポイントカット(トップカット)

コード:

#include <iostreamの> 
する#include <cstdioを> 
する#include <CStringの>
 に#define N 100010
 使用して 名前空間STDを、
構造体ノードは{
     int型、隣。
} E [N * 2 ]。
int型N、M、IDX、CNT、TOT。
int型のヘッド[N]、DFN [N]、低[N]。
BOOL 切断[N]。
ボイド追加(int型のx、int型のY){ 
    E [ ++ CNT] .next = Y。
    E [CNT] .TO = 頭部[X]。
    ヘッド[X] = CNT。
} 
ボイド tarjan(int型、U、int型のFA){ 
    DFN [U] =低[U] = ++ IDX。
    int型の子= 0 ;
     以下のためにint型 ; I I = I =ヘッド[U] {E [I] .TO)
          INT NX = E [I] .next。
         もし(!DFN [NX]){ 
             tarjan(NX、FA)。
             低[U] = 分(低[U]、低[NX])。
             もし(低[NX]> = DFN [U] U &&を=!FA)
                 カット[U] = 1 もし子供++(uはFAを==) 
         } 
        低[U] = 分(低[U]、DFN [NX])。
    } 
    であれば(子> = 2 && uは== FA)
        カット[U] = 1 
} 
int型のmain(){ 
    scanf関数(" %D%dの"、&​​N、&M)。
    以下のためにint型 iは= 1 ; iが<= M; iは++ ){
         int型、B。
        scanf関数(" %D%dの"、&​​、&B)。
        追加(A、B)。
        (B、A)を加えます。
    } 
    のためのINT I = 1; I <= N。私は++ の場合(![i])とDFN 
            tarjan(I、I); 
    以下のためにint型私= 1 ; iが<= N; iが++ 場合([i]が切断)
            TOT ++ 
    printf(" %d個の\ n " 、TOT)。
    以下のためにint型 I = 1 iは++; iが<= N であれば(カット[i])と
            のprintf(" %dの" 、I)。
    リターン 0 ; 
}
コード

 

 

約強連結成分:

強い最大ユニコムの部分グラフ強く接続されていないグラフ(リアンの問題を介して)

スタックを使用するには

例:

 

おすすめ

転載: www.cnblogs.com/yanxiujie/p/11441811.html