クリティカルリンクUVA - - 796テーマ別9連結グラフCを[Kuangbinは飛ぶためにあなたを取ります]

この質問は、ブリッジの数を依頼することです。

そして、ブリッジ判断の対応定理があります。

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 

* /

 

おすすめ

転載: www.cnblogs.com/bluefly-hrbust/p/11228088.html