私は実際に豚の脳すごいです
姉妹校はすべてに約ある私が食べています
瞬間
今日、私はそれを書き留めた方が良いと思い、少し見直し
結局のところ、私の記憶
冬の風のように
だけでなく、ブラシのブラシも達人を吹きます
カット点と切刃(ブリッジ)について:
カットポイント:図はそれを穿刺しても、後に非通信側になるために
切削条件のポイントになることができる:ルートノードの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 ; }
約強連結成分:
強い最大ユニコムの部分グラフ強く接続されていないグラフ(リアンの問題を介して)
スタックを使用するには
例: