Antのトリップ(ストローク数を塗ります)

あなた無向グラフNのポイントとMのエッジは、Mのことを確実にするためにエッジが異なっており、少なくとも今は再び塗られているすべてのエッジにストローク数を聞いてみたい、少しエッジとは自己ループは存在しません。(ペンのストロークは、紙を残すための時間ではありません)

<ビット/ STDC ++ H>の#include
 の#define再戻り
 の#defineためINC(I、L、R)を(I = 1をint型、I <= R; ++ I)の
 使用 名前空間STDを、
テンプレート <型名T>インラインボイド RD(T&X)
{ 
    チャー C。BOOL F = 0 一方、((C = GETCHAR())< ' 0 ' || C> ' 9 'であれば(C == ' - ')、F = 1 
    X = C ^ 48 一方、((C = GETCHAR())> = ' 0' &&のC <= ' 9 ')、X = X * 10 +(C ^ 48 )。
    もし(F)X = - X。
} 

のconst  int型 MAXN = 100005 INTのN、M、D [MAXN]、FA [MAXN]、CNT [MAXN]。
インラインint型の検索(INT X)
{ 
    再X == FA [x]はx:FA [X] = (FA [X])を見つけます。
} 
int型のmain()
{ 
    
    int型、X、Y、F1、F2。
    一方、(〜(scanf関数(" %d個の%のD "、&​​N、&M)))
    { 
        INC(I、1、N)FA [I] = I、CNT [i]は= Dの[I] = 0 ;
        もし(!M)
        { 
            のprintf(" 0 \ n " );
            続け; 
        } 
        
        
        INC(I、1 、M)
        { 
            RD(x)は、RD(Y)。
            ++ D [X]; ++ D [Y]。
            F1 =検索(FA [X]); F2 = 検索(FA [Y])。
            もし(!F1 = F2)FA [F1] = F2;
            // 并查集判连通
        } 
    
        INC(I、1 、N)
        { 
            場合(D [i]が&1 CNT ++は、[(FA [I])の検索]; // 互いに素セットあなたの中に蓄積
        } 
        
        int型 ANS = 0 ; 
        incがある(I、1。、N-)
         のIF(FA [I] ==私はD [I]を&& &&! CNT [I])= + ANS 1。;
         // もし側しかし有し互いに素なセットオイラー+ 1 ANS。
         ANS = +(CNT [I] >> 1。);
         // そうでない場合は互いに素なセットパスオイラーストロークは見つける 
        のprintf(" %d個の\ N- " ; ANS)を
    } 

    再度0 ; 
}

 

おすすめ

転載: www.cnblogs.com/lsyyy/p/11421825.html