再帰オイラー道路テンプレート。アーク電流の最適化。

#include <ビット/ STDC ++ H.>
 の#define F(I、A、B)は(INT I = A;私は= Bを<; I ++)
 の#define LLロングロング
 の#define PF(A)のprintf(「% D「A)
 の#define PHNプット(」「)
 使用して 名前空間STD;
 int型(読み取り);
 / * 。決まっ起点を容易に選択することができない場合* M ^ 2への電流の最適化、そうでなければカードアークが、側面が存在しなければなりません彼は、直接接続されていない1 * / 
の#define N 400010 
 INT T、N-、M;
 INTチュー[N]、ルテニウム[N]、デュ[N]から[N << 1。 ]、FIR [N << 1 ]、ID [N << 1 ]、頭部[N]、CNT;
 無効追加(int型の Xを、int型 Yを、INTID){に[++ CNT] = Y;モミ[CNT] =頭部[X];頭部[X] = CNT; ID [CNT] = ID;}
 int型 STA [N << 1 ]、VIS [N < < 1 ]、トップ。
ボイド DFS1(int型X){
     ためint型 I = ヘッド[X]; I;){
         ながら(I && VIS [i])とI = FIR [I]。
        場合(I){ 
            VIS [I] = 1頭[X]は=; モミ[I]; 
            ([I]に)DFS1。
            STA [ ++トップ] = ID [i]は、
            I = ヘッド[X]。
        } 
    } 
}     
無効 DFS2(int型X){
     ためint型 I = ヘッド[X]; I;){
         ながら(I && VIS [I] && VIS [I ^ 1 ])は、i = FIR [I]。
        もし(I){ 
            VIS [I] = VIS [iは^ 1 ] = 1 ;頭部[X] = モミ[I]。
            ([I]に)DFS2。
            STA [ ++トップ] = ID [i]は、
            I = ヘッド[X]。
        } 
    } 
} 
ボイド WORK1(){ // 不交换、单向 
    CNT = 0 int型 I = 1、U、V、I <= M; ++I){ 
        U =を読み取る(); V = 読み取ります()。
        (U、V、i)を追加します。++チュー[U]; ++ RU [V]。
    } 
    INT S = [に対して2 ]、x = 0、Y = 0 
    F(I、1 、N){
         場合(チュー[I] -ru [I] == 1)++ X、S = I。
        そう であれば(RU [I] -chu [I] == 1)++ Y。
        それ以外の 場合(!チュー[I] = RU [I]){ 
            プット(" NO ");終了(0 ); 
        } 
    } 
    もし ||((!X &&!y)は(x ==1 &&のy == 1 ))。
     {プット(" NO ")、出口(0 );} 
    DFS1(S); 
    F(I、1 、M){
         場合(!VIS [I]){プット(" NO ")、出口(0 );} 
    } 
    プット(" YES " );
    以下のためにint型 I =頂; I> 0 ; - I)PF(STA [I]); PHN。
/ *     memsetの(VIS、0、はsizeof(VIS)); 
    { - (I; I> 0、I =トップINT)のために
        、S = [I]に、VIS [I] = 1。
    }
    (!VIS [i])とF(I、1、m)の場合プット( "WA");
    プット(「よりよいです」)。* / 
}     
ボイド WORK2(){ // 交换、双向 
    CNT = 1 以下のためにint型 I = 1 ; I <= M ++、U、V {I)
        U =を読み取る(); V = 読み取ります()。
        (U、V、i)を追加し、追加(、uとVを、 - I)。
        ++デュ[U]; ++ デュ[V]。
    } 
    INT S =乃至[ 2 ]、x = 0 
    F(I、1 、N){
         場合(DU [I]&1)++ X、S = I。
    } 
    場合(Xの==2 ||!バツ);
     {プット(" NO ")、出口(0 );} 
    DFS2(S); 
    F(I、1 、M){
         場合(VIS [I <<!1 ] || VIS [I <<!1 | 1 {プット(])" NO ")、出口(0 );} 
    } 
    プット(" YES " );
    以下のためにint型 I =頂; I> 0 ; - I)PF(STA [I]); PHN。    
} 
int型のmain(){ 
    freopenは(" merge.in "R"STDIN); freopenは(" merge.out " " W "STDOUT);
 / * * * ///     freopenは(" ex_merge4.in " "R"、STDIN); // freopenは(" merge.out 」、 ")、" W STDOUT; 
    T =)は(読み取り; N =(読み取り); mは= read()は、
     もし(Tの== 2 )WORK1();
     そうでない場合(T == 1 )WORK2(); 
} int型読み取り(){
     int型、S = 0、F = 0 ; CHAR CH = GETCHAR();
     ながら(!isdigit(CH))は、f = CH == '- " 
、CH = getchar関数();
    一方、(isdigit(CH))S = sの* 10 +(CH ^ 48)、CH = GETCHAR()。
    返す fは- ?sの:秒; 
} 
/ * 
G ++ dp.cpp 
./a.out 
G ++ merge.cpp -std = C ++ 11 
./a.out 
2 5 
2 3 
2 5 
3 4 
1 2 
4 2 
* /
テスト100T1

この質問のために:アーク電流を最適化する、または決まった出発点がない場合、M ^ 2にはまり込む選ぶことができますが、彼の側にあっ接続されている必要があり、あなたは直接1を使用することはできません。

アーク電流は、N + Mを添加した後、中にスナップまたはすることができ、M ^ 2(2点直接縁mに接続されています)

おすすめ

転載: www.cnblogs.com/seamtn/p/11794166.html