【POI2011】ごみ

フェイス質問

https://loj.ac/problem/2162

問題の解決策

片側がループ、判断を満たすも削除直接的に二回表示された場合、全て同じ側の最初の水の問題は、一つだけ必要です。

直接オイラーツアー。

#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 = 0CHAR 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 ; 
}
   

 

おすすめ

転載: www.cnblogs.com/shxnb666/p/11349683.html