あなた無向グラフ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 ; }