この質問は、ブリッジの数を依頼することです。
そして、ブリッジ判断の対応定理があります。
uは隣接ノードに、ノードがより最小タイムスタンプであり
、この点でのみUフルーツによって到達可能であること、大順に電流Uアクセスし、
それらの間の隣接エッジがありますブリッジ
書式#include <iostreamの> 書式#include < 文字列の.h> の#include <アルゴリズム> 書式#include <stdio.hに> 使って 名前空間はstd; const int型 SIZE = 100010 ; 構造体ノード{ int型Uを、V。 } brige [SIZE]。 int型版ヘッド[SIZE]、[SIZE * 2 ]、次に[SIZE * 2 ]。 INT DFN [SIZE]、低[SIZE]、N、M、TOT、NUM、CNT。 ボイド追加(int型のx、int型のY){ 版[ ++ TOT = Y、次に[TOT =頭部[X]、ヘッド[X] = TOT。 } のボイドTarjan(INT U、INT PRE){ DFN [U] =低[U] ++ = NUM; のため(int型のI =ヘッド[U]; I; I = 次に[I]){ int型 V = 版[I] ; IF(V == PRE)続行; IF(!DFN [V]){ Tarjan(V、U); 低[U] = 分(低[U]、低[V]); IF(低[V] > DFN [U]){ / * 隣接ノードとUに、一つのノードがより最小のタイムスタンプであり 、その後、大アクセスする電流Uの順序は、その点uは果実が到達することができると言うことです それらに隣接する側との間のブリッジです * / CNT ++; 気[CNT] .U = U。 気に[CNT] .V = V; 場合(ケア[CNT] .Uは> {[CNT] .V気) スワップ(ケア[CNT] .Uを、気[CNT] .V)。 } } } そうでない 場合(低[U]> [V] DFN) 培地[U] = 分(低[V] DFN、[IN])。 } } ボイドのinit(){ MEMS(ケア、0、はsizeof (ケア))。 MEMS(低、0、はsizeof (低))。 MEMS(版、0、はsizeof(版))。 memset(DFN、0、はsizeof (DFN))。 memsetの(次に、0、はsizeof (NEXT))。 memsetの(頭、0、はsizeof (ヘッド))。 CNT = 0 ; NUM = 0 ; TOT = 1 。 } BOOL CMP(ノードA、ノードB){ 場合(AU == BU)戻り AV < BV。 戻る auの< BU。 } int型のmain(){ int型のID、TMP、NX。 しばらく(〜のscanf(" %がd "、&N)){ 場合(N == 0 ){ のprintf(" 0臨界リンク\ n \ n " ); 続け; } のinit(); 以下のために(int型私= 1 ; iが<= N; iが++ ){ scanf関数(" %のD "、&ID)。 ID ++ ; getchar関数(); getchar関数(); scanf関数(" %のD "、&TMP)。 getchar関数(); 以下のための(int型J = 1 ; J <= TMP; J ++ ){ scanf関数(" %のD "、およびNX)。 NX ++ ; (ID、NX)を加えます。 (NX、ID)を追加します。 } } のための(int型 i = 1 ; iが<= N; iが++ ){ 場合(!tarjan(I、I)DFN [I])。 } のprintf(" N \%dの臨界リンク" 、CNT)。 ソート(brige + 1、brige + 1本の + CNT、CMP)。 以下のための(int型私は=1 ; iは= CNTを<; iは++ ){ のprintf(" %のD - %Dを\ n "、brige [I] .u- 1、brige [I] .v- 1 )。 } のprintf(" の\ n " ); } 戻り 0 。 } / * 3つの臨界リンク 、0 - 1 3 - 4 6から7 * /