[POJ3694]ネットワーク

愚かなバッチ。

真に

長い時間のために遊ぶ、アウトTは、ローカル変数を従事されるようになりました。LV

人は料理の有罪することができ、本当に何が問題です。

NMD WSMのWSL

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <CStringの> 
の#include <cstdlib> 
書式#include <キュー> 
の#include <アルゴリズム>
 使用して 名前空間はstd;
CONSTの INT N = 1E5 + 10、M = 4E5 + 10 INTのN、M、Q、ANS。
INT [M]、ヘッド[N]、次に[M]版、TOT = 1 INT DFN [N]、低[N]、NUM。
BOOL ブリッジ[M]。

ボイド追加(int型のx、int型のY){ 
    版[ ++ TOT = Y。
    次の[TOT]= ヘッド[X]。
    ヘッド[X] = TOT。
} 

ボイド tarjan(int型のx、int型inedge){ 
    [X] DFN =低[X] = ++ NUM。
    以下のためにint型 I =ヘッド[X]; I; I = 次に[I]){
         int型、Y = 版[I];
        もし(!DFN [Y]){ 
            tarjan(Y、I)。
            低[X] = 分(低[x]は、低[Y])。
            もし(DFN [X] <低[Y])ブリッジ[I] =ブリッジ[I ^ 1 ] = 1 
        } それ以外の 場合(I =(inedge ^!1))、低[X] = 分(低[x]は、DFN [Y])。
    } 
} 
int型のDCC、C [N]。

ボイド DFS(INT X){ 
    C [X] = DCC。
    以下のためにint型 I =ヘッド[X]; I; I = 次に[I]){
         int型、Y = 版[I];
        もし(C [Y] ||ブリッジ[I])を続けます
        DFS(Y)。
    } 
} 
int型の HC [N]、VC [M]、NC [M]、TC = 1 

ボイド ADDC(int型のx、int型のY){ 
    VC [ ++ TC =Y; 
    NC [TC] =のHC [X]。
    HC [X] = TCと、
} 
キュー < INT > Q。
INT D [N]、F [N] [ 20 ]、FA [N]。
ボイドBFS(){ 
    q.push(1 )。
    D [ 1 ] = 1 一方、(q.size()){
         int型 X = )(q.front。
        q.pop(); 
        以下のためにint型 I = HC [X]; I; I = NC [I]){
             int型、Y = VC [i]は、
            もし(D [Y])続行; 
            D [Y] = D [X] + 1 
            F [Y] [ 0 ] =のX。
            INTの J = 1 ; J < 20 ; J ++)[Y] [J] = F [F [Y] [J - F 1 ] [J - 1 ]。
            q.push(Y)。
        } 
    } 
} 

int型 LCA(int型のx、int型のY){
     場合(D [X] < D [Y])スワップ(X、Y)
    以下のためにint型 I 19 =; I> = 0 ; i-- 場合(D [F [X] [I]]> = D [Y])X =F [X] [I];
    もし(x == y)は戻りX。
    以下のためにint型 19 = Iを、I> = 0 ; i-- であれば(!F [x]は[I] = F [Y] [i])と、X = F [X] [i]は、Y = Y [F ][私];
    戻り [X] [F 0 ]。
} 

INT  GETINT X){
     場合(X == FA [X])戻りX。
    戻り FA [X] = GET (FA [X])。
} 
int型のT。
INT (){主
    
    ながら1 ){
         ++ ; T
        CIN >> N >> M。
        もし(nは== 0ブレーク
        memset(C、0はsizeof (c)参照)。
        memsetの(D、0はsizeof (d)参照)。
        memset(VC、0はsizeof (VC))。
        memset(NC、0はsizeof (NC))。
        memset(HC、0はsizeof (HC))。
        memset(版、0はsizeof (版))。
        memset(DFN、0はsizeof (DFN))。 
        のmemset(低、0はsizeof (低))。
        memsetの(次に、0はsizeof (NEXT))。
        memsetの(頭、0はsizeof (ヘッド))。
        memset(ブリッジ、0はsizeof (ブリッジ)); //别问我为什么这么脑瘫
   TOT
= TC = 1 DCC = NUM = 0 printf(" ケースは%d:\ N " 、T); 以下のためにint型 I = 1 ; I <= M; iは++ ){ int型のX、Y。 scanf関数(" %D%D "、&​​X&Y)。 (x、y)を加えます。追加(Y、X)。 } のためのint型 i = 1 ; iが<= N; iが++ ){ 場合(!DFN [i])と tarjan(I、0 ); } のためにint型 i = 1 ; iがn = <; iは++ 場合(!{C [i])と ++ DCC。 DFS(I); } のためにint型 I = 2 ; I <= TOT; iは++ X =版[I ^){ int型 Y)。1 ]、Yは= [I]のver。 もし(C [X] == C [Y])続けます ADDC(C [X]、C [Y])。 } BFS()。 以下のためにint型 i = 1 ; iは= DCC <; iは++ ){ FA [I] = I。 } ANS = DCC - 1 cinを >> Q; 一方、(Q-- ){ int型X、Y。 scanf関数(" %dの%のD "、およびX、および X = Cの[X]、Y =C [Y]; int型 P = LCA(X、Y); // LCA P =(C [X]、C [Y])、 X = GET (X); //同じE-DCC集点与えます木、それらのエッジが(同じリングに)もはやパス「ブリッジ」であります
一方、(D [X]> D [P]){ 
                FA [X] = F [X] [ 0 ]; 
                ANS - ; //ブリッジはもはや側ではありません後に
                X = GET (X); // Cから[x]は親ノードにPまで
            } 
            Y = GET (Y);
             一方(D [Y]> D [P]){ 
                FA [Y] = F [Y] [ 0 ]; 
                ANS - ; 
                Y = GET ( Y-); 
            } 
            のprintf(" N- \%のD " 、ANS); //辺の総数を差し引いた後の答えであります
        }
        coutの << てendl; 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/11haonb/p/11164877.html