あなたが戻って出発点に、次にマップ全体のすべてのエッジを経験し始めると、一度だけ、とした場合、これはノードからオイラーです。オイラー路。
分析方法:
1.無向グラフ:グラフは、図通信で与えられ、すべてのノードは偶数です。
2.図面:図所与の通信のグラフ、およびすべてのノードのゼロ。
基本的な質問HDU 1878オイラー(無向グラフ)かどうかを判断します
溶液:出力は1、そうでなければ0を出力であれば、一つだけのノードI == Prが存在する場合、ここでI [i]は、この図は、ループを構成し、すなわち、ことを忘れます。それは[i]は、それがヨーロッパで、蓄積の検索および表示は明らかであるとCNTとのループは、[]、両方の偶数およびI == PRの一つだけを各点の数を記録するか否かを判断します裏道へ。
#include <iostreamの> する#include <アルゴリズム> の#include <cstdioを> する#include <CStringの> 使用して 名前空間STD。 INT PR [ 1005 ]、CNT [ 1005 ]。 INT見つける(INT X) { 場合(X =!PR [X]) 戻り PR [X] = 見つける(PR [X])。 リターンのx; } ボイドは、(参加INT A、INT B) { int型 F1 =検索(A)、F2 = 検索(B)。 もし(F1!= F2) PR [F1]= F2; 返します。 } int型のmain() { int型、N M。 一方、(CIN >> N) { 場合(N == 0 ) ブレーク。 cinを >> メートル。 memset(CNT、0、はsizeof (CNT))。 以下のために(int型 i = 1 ; iが<= N; iは++ ) PR [I] = I。 用(int型 I = 1 ; I <= M Iは++ ) { int型、B; CIN >> A >> B; CNT [A] ++ ; CNT [B] ++ ; (a、b)が参加。 } int型デュ= 0 。 int型 OU = 0 ; 以下のために(int型私= 1 ; iが<= N; iが++ ) { 場合(CNT [I]%2 == 0 ) OU ++ 。 もし(PR [I] == I) デュ ++ 。 } 場合(OU == N &&デュ== 1 ) COUT << " 1 " << ENDL。 他の 裁判所未満 << " 0 " << てendl; } }
町を結ぶMの道路はAntの国は、N towns.Thereで構成されています。
Antのトニーは、一緒に彼の友人で、国のすべての部分を通過したいと考えています。
彼らはすべての道路を訪問する予定で、すべての道は、正確な1 time.Howeverのために訪問しなければならない、それは彼らがいくつかのグループにすべての人々を分割しようとしているpeople.Soの一つのグループだけのために不可能なミッションとすることができ、それぞれが開始することができ異なるtown.Nowでトニーは、自分の目標を達成するために形成する必要がアリの少なくともグループが何であるかを知りたがっています。
InputInputは、複数のcases.Testケースは、いくつかの空白行で区切られて含まれています。各テストケースは、各ラインに含まれるM線でのAnt Country.FollowedにおけるN町及びM道路が存在することを示す、2つの整数N(1 <= N <= 100000)、M(0 <= M <= 200000)で始まります道路接続町aおよび町b.Noがあることを2本の道路を示す二つの整数、B、(1 <= A、B <= N)が同じになり、そしてtown.OutputForそれぞれ同じ接続ない道路が存在しませんそのgoal.Sample入力を達成するために形成する必要があるテストケース、出力以上のグループ
3 3 1 2 2 3 1 3 4 2 1 2 3 4
サンプル出力
1 2
ヒント
~~~新しい注意:誰ロードタウンが接続している場合は、トニーにはタウンについて忘れないかもしれない 。でサンプルを1、トニーと彼の友人たちだけのグループの一つの形式は、どちらかのAT彼らは町1,2-開始することができ、または3 でサンプル2は、トニーと彼の友人は、形成しなければならない 。2グループを
、マップ与えられたすべての辺を通過するいくつかのストロークをお願いします。
オイラー、知識が最後のブログで言及されています。奇数がある場合、各点のうちのために、あなたはすべてのポイントを通過する奇数/ 2ペンを必要としています。
図分析は、図の通信かどうかを示していなかったので、図が複数存在することができ、この場合、ANS =奇数/ 2 +オイラー(だけでも設定点を含む)の数
解析コード
#include <iostreamの>
する#include <アルゴリズム>
の#include <cstdioを>
する#include <CStringの>
使用して名前空間STD。 typedefの長い長いLL。 const int型MAXN = 1E5 + 10。// jishu / 2 + oulatu INT PR [MAXN]、CNT [MAXN]、マーク[MAXN]。INTのN、M。int型ANS = 0 ; ボイド最初の(){ため(I = 1 int型、iは= N <; iは++ ){PR [I] = I。}のmemset(CNT、0、はsizeof (CNT))。memsetの(マーク、0、はsizeof (商標))。ANS = 0 ; } INT(INT見つけるX){IF(!X = [X] PR [X])リターンPRを= (PR [X])を見つけます。リターンのx; }ボイド(INT A、INT参加B){int型F1 =検索(A)、F2 = 検索(B)。(もし!F1 = F2)PR [F1] = F2; 返します。}のボイドAC(){用(INT I = 1; I <= N; I ++は){IF(CNT [I] = 0%2!){int型F = 検索(I); //奇数の統計ポイント数。iはオイラー図、その後、根ノードは、I 1標識されない奇数の点度である場合、[]記録マークの配列は、この図は、オイラーの代表ではありません。マーク[F] = 1 ; ANS ++ ;}} ANS / = 2 ; <;(= N-Iが++ Iがint I = 1 //統計オイラー図IF {(CNT [I] 0)> )//例入力、939点は3つだけの関係、[i]は= 0、計算に含まれていない確かに少なからず、CNTが与えられます。F = INT { (i)を探す; I //ルートノードを見つけ、1とラベル付けされていない場合、私の程度を示すことは偶数であり、そして満足PRされる[I] == I(I == F)( すなわち、に見出さX == PRやない特異点の点の度合いが存在する場合、PR I ==は、[I]があるため、この数字は、オイラーある[X])説明ラベル
//マークになっている必要があります。++ ANS; IF(マーク[F] == 0 && PR [I] == I){ANS ++ ;}}}} int型のmain(){一方(CIN >> N- M){まず(); //(のための初期化1 I = INT; I <= M; I ++ {int型)A、B、CIN >> B、参加(A、B); CNT [A] ++ ;; } 交流(); coutの<< ANS << てendl; } 0を返します。}