愚かなバッチ。
真に
長い時間のために遊ぶ、アウト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 GET(INT 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 。 }