フェイス質問
問題の解決策
片側がループ、判断を満たすも削除直接的に二回表示された場合、全て同じ側の最初の水の問題は、一つだけ必要です。
直接オイラーツアー。
#include <スタック> の#include <ベクトル> の#include <cstdioを> する#include <CStringの> する#include <iostreamの> する#include <アルゴリズム> の#define N 100050 の#define intを登録RI 使用して 名前空間STDを、 INTのN、M、U、V、MS、MT、F [N]、VIS [N]。 スタック < int型 > S; INTのCUR [N]、度[N]。 ベクター < INT > ED [N]、VV、であり; インラインint型リード(){ int型 RET = 0、F = 0。CHAR CH =getchar関数(); 一方、(CH < ' 0 ' || CH> ' 9 ')は、f | =(CH == ' - ')、CH = GETCHAR()。 一方、(CH> = ' 0 ' && CH <= ' 9 ')RET * = 10、RET + =(CH- ' 0 ')、CH = GETCHAR()。 リターン F - ?RET:RET; } INT GETF(INT X){ 場合(X == F [X])戻りX。 戻り F [X] = GETF(F [X])。 ボイド add_edge(INT U、INT V){ [GETF(U)] F = GETF(V)。 to.push_back(V); vv.push_back(0)。ED [U] .push_back(to.size() - 1 )。 to.push_back(U)。vv.push_back(0)。ED [V] .push_back(to.size() - 1 )。 DEG [U] ++; 度[V] ++ ; } ボイド euler1(INT X){ ため(RI&I = CUR [X]; iは<ED [X] .size(); iは++ ){ int型、E = ED [X] [I]; もし(VV [E])を続けます。 VV [E] = VV [ 1^ E] = 1 。 ([E]に)euler1。 ([E]に)s.push。 } } int型のmain(){ N)=(読み取り; M = 読み取ります(); 以下のために(RI iは= 1 ; iが<= N; iは++)F [I] = I。 用(RI i = 1 ; I <= M; iは++ ){ U = read()は、V =読み取る()、MS =読み取る()、MT = )(読み取ります。 もし(!MS = MT)add_edge(U、V); } のための(RI i = 1 ; I <= N; iは++)場合(DEG [I]&1 ){ プット(" NIE " )。 リターン 0; } INT ANS = 0 。 用(RI i = 1 ; I <= N; iは++)場合(!I = GETF(I)){ 場合(!VIS [GETF(I)])ANS ++ 。 VIS [GETF(I)] = 1 。 } のprintf(" %d個の\ n " 、ANS)。 用(RI i = 1 ; I <= N; iは++ ){ 場合(VIS [GETF(I)] == 2 || VIS [GETF(I)] == 0)続けます。 VIS [GETF(I)] = 2 ; euler1(I); printf("%d個"s.size()); のprintf(" %d個"I); しばらく!(s.empty())のprintf(" %d個」、s.top())、s.pop(); プット("" ); } 戻り0 ; }