フェンスに乗るP2731乗馬修理フェンス(オイラーパス)

欧拉欧拉欧プル

あなたのマップを与える、辞書順最小のオイラーパスを見つけます

オイラーパステンプレートは、アクセス・パスについてスタックメモリと、そうでない場合は、DFSそれらをしないように直接出力するパスWAように注意してください

別のピット側が重いので、Jレコードは複数のパスを持っていると私は、各アクセス隣接行列が保存される隣接行列を使用します

オイラーロードに概要を参照してください。http://www.mynameisdhr.com/%e5%85%b3%e4%ba%8e%e6%ac%a7%e6%8b%89%e8%b7%af/

コード:

#include <ビット/ STDC ++。H>
 に#define INT長い長
 の#define SC(A)のscanf( "%のLLD"、&A)
 の#define SCC(B)のscanf( "%のLLDの%のLLD"、&、&B)
 #define SCCC(A、B、C)のscanf( "%LLD%LLD%LLD"、&、&B、&C)
 の#define SCHAR(A)のscanf( "%のC"、&A)
 の#define PR(A)のprintf( "%のLLD"、A)
 の#defineは(iは、b)のための(iは= int型foは、私は、Bを<; ++ i)は、
 の#define再(I、B)(iは= int型のために、私<= B; ++ I)
 の#define RFO(I、B)(iは= int型のために、I> B; - I)
 の#define RRE(I、B)(iは= int型のために、 I> = B; - I)
 の#define PRN()のprintf( "の\ n")
 の#define PRS()のprintf(」 "
) の#define MKP make_pair
 の#definePII対<整数、整数>
 の#defineパブ(a)の一back(A)
 の#define POB()pop_back()
 の#define PUF(a)はpush_front(A)
 の#define POF()pop_front()
 の#define FST最初
 の#define SND第二
 の#define FRTフロント()
 の#defineバック()BAK
 の#define MEM0(A)のmemset(0、はsizeof(A))
 の#define memmx(A)のmemset(0x3f3fを、はsizeof(A))
 の#define memmn (A)のmemset(、-0x3f3f、はsizeof(A))
 の#defineデバッグ
 の#defineダブルデシベル
 の#define yyesはcout << "YES" <<てendlを。
#define NNO裁判所未満<< "NO" <<てendl;
使用して 名前空間はstd; 
ベクトルのtypedef < 整数 > VEI。
ベクトルのtypedef <PII> VEP。
マップのtypedef < int型int型 > MPII。
マップのtypedef < CHARINT > MPCI。
マップのtypedef < 文字列int型 > MPSI。
typedefの両端キュー < 整数 > deqi。
両端キューのtypedef < 文字 > deqc。
typedefのPRIORITY_QUEUE < 整数 > mxpq。
typedefのPRIORITY_QUEUE < INT、ベクトル< INT >、大きな< INT >> mnpq。
typedefのPRIORITY_QUEUE <PII> mxpqii。
typedefのPRIORITY_QUEUE <PII、ベクトル<PII>、大きな<PII>> mnpqii。
const  int型 MAXN = 500005 ;
const  int型 INF = 0x3f3f3f3f3f3f3f3f const  int型 MOD = 100000007 ;
CONST DB EPS = 1E- 10 INT qpow(INT A、INT B){ int型 TMP =%MOD、ANS = 1同時に(B){ 場合(B&1){ANS * = TMP、ANS%= MOD;} TMP * = TMP、TMPの%= MOD、B >> = 1 ;} 戻りANS;}
 int型 lowbit(INT X){ リターン X& - X;}
 int型の最大値(int型int型 b)は、{ 戻る > B?A:B;}
 int型分(INT A、INT B){ 戻り <bは?A:B;}
 int型(MmaxをINTint型 B、INT {c)に戻り};最大(MAX(B、C))
 のint MMIN(INTint型 B、INT C){ 戻り分(分(B、C));}
 ボイド MOD(INT&A){A + = MOD;%= MOD;}
 ブール CHK(int型)は{}
 int型半(INT L、int型 R){ 一方(L <= R){ int型、M =(L + R)/ 2もし(CHK(M))はr = M- 1 L = M + 1 ;} 戻りL;}
 int型 LL(INT P){ 戻り P << 1 ;}
 int型の RR(INTP){ 戻り P << 1 | 1 ;}
 int型 MM(int型 L、INT R){ リターン(L + R)/ 2 ;}
 int型 LG(INT X){ もし(x == 0リターン 1リターンINT)LOG2(X)+ 1 ;}
 ブール smleql(dBのB、DB){ 場合(<B ||ファブ(AB)<= EPS)を返す 戻り }; 
DB LEN(DB、DBのB、dBのC、DB d)は{ 戻りSQRT((AC)*(AC)+(BD)*(BD ));}
 BOOL ISP(INT X){ 場合(x == 1を返す もし(Xの== 2を返す 以下のためのint型 I = 2を ;;私は= xを<* ++ i)があれば(のx%iの== 0を返す 戻り ;} 
インラインint型リード()
{ 
    CHAR CH = GETCHAR()。INT S = 0、W = 1 しばらく(CH <48  || CH>57){ 場合(CH == ' - ' = W) - 1 ; CH = GETCHAR();}
     一方(CH> = 48 && CH <= 57){S =(S << 1)+(S << 3)+ CH- 48、CH = GETCHAR();}
     戻り S * W。
} 
インラインボイド書き込み(INT X)
{ 
    場合(X < 0)のputchar(' - ')、X = - X。
    もし(X> 9)書き込み(X / 10 )。 
    のputchar(X 10 + 48 )。
} 

int型 N、S = 1、F、X、Y、G [ 1029 ] [ 1029 ]。
int型の D [ 1029 ]; 
スタック < 整数 > SS。

ボイド DFS(INT X){
 //     COUT << X << ENDL。
    (I、再1 、N){
         場合(G [X] [I]){ 
            G [X] [I] - 
            G [i]は、[X] - 
            DFS(I); 
        } 
    } 
    ss.push(X)。
}

{main()の符号付き
    ios_base :: sync_with_stdio( ;}0 ); 
    cin.tie(0)、cout.tie(0 )。
    cinを >> F; 
    再(I、1 、F){ 
        CIN >> X >> Y。
        G [X] [Y] ++ ; 
        G [Y] [X] ++ ; 
        D [Y] ++、D [X] ++ ; 
        N = MAX(N、X)。
        N = MAX(N、Y)。
    } 
    再(I、1、n)の場合(D [i]は%2 == 1){S = I。壊れ
    DFS(S); 
    同時に(!ss.empty())coutの<< ss.top()<< てendl、ss.pop();
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/oneman233/p/11489464.html