それはほとんど夏の時間だし、それはそれはほとんど夏の施工時間だということを意味します!今年は、リモート島の熱帯の島の楽園上の道路を担当している良い人は、島のさまざまな観光スポットの間でつながる様々な道路を修復し、アップグレードしたいと思います。
道路自体もかなり興味深いものです。彼らは上や橋やトンネルを使ってお互いの下を通過むしろ交差点で会うませんが、決してそれに起因島の奇妙な習慣に、道路が配置されています。観光客は取り返しがつかないほど失わならないように、この方法では、各道路は、2つの特定の観光スポットの間で実行されます。
残念ながら、建設会社は、特定の道路上で動作する場合、各道路上で必要な修理やアップグレードの性質を与えられ、それがどちらの方向で使用不可能です。それは建設会社は、任意の特定の時間にのみ1つの道路上で動作しても、2つの観光スポット間を移動することが不可能になった場合、これは問題を引き起こす可能性があります。
だから、リモート島の道路部門は、この問題を解決を助けるためにあなたのコンサルティングサービスを呼びすることを決定しました。新しい道路が任意の1本の道路が工事を受けている場合は、最終的な構成では、まだ残っている道路を使って任意の二つの観光スポット間を移動することが可能であるような方法で様々なアトラクションの間に建設されなければならないことを決定しました。あなたの仕事は、必要に応じて新しい道路の最小数を見つけることです。
入力
入力の最初の行は正の整数で構成されますN及びR 3≤スペースで区切られた、N島の観光名所の数であり、2≤1000年≤ R ≤1000は、道路の数です。観光スポットは、簡便に1からラベル付けされているn個。以下のそれぞれのRラインが二つの整数、で構成されますV及びW道路標識観光名所の間に存在することを示し、空白で区切られた、V及びW。あなたはそれぞれの道をどちらの方向に移動すること、および観光スポットの任意のペアは、それらの間に最大で1つの道路に直接持っていることに注意してください。また、あなたは現在の構成では、任意の二つの観光スポット間を移動することが可能であることが保証されています。
出力
私たちが追加する必要がある道路の最小数を示す整数、からなる1行、。
サンプル入力
サンプル入力1 10 12 1 2 1 3 1 4 2 5 2 6 5 6 3 7 3 8 7 8 4 9 4 10 9 10 サンプル入力2 3 3 1 2 2 3 1 3
サンプル出力
サンプルについて1入力出力 2 出力サンプルの入力2は、 0
答えはユニコムテンプレート両面後、ポイント+1以外度2の点の数を減少させています
書式#include <iostreamの> の#include <CStringの> 使用して 名前空間はstdを、 const int型 MAXN = 5005 ; int型[M、サイズ、ヘッド[MAXN]、低[MAXN]、N、FA [MAXN]、[MAXN] DFN、NCNT、CNT、ハッシュ[MAXN]、ティム、PX [MAXN]、PY [MAXN]、D MAXN]; 構造体のエッジ{ int型V、NEX。 } E [MAXN << 1 ]。 ボイド ADDE(INT U、INT V){ E [サイズ] .V = V; E [サイズ] .nex =頭部[U];頭部[U] =サイズ++ 。 } INT(見つけるINT X){ 戻り?X == FA [x]はx:FAを[X] = (FA [X])を見つけます。 } ボイド tarjan(INT U、INT PAR){ 低い[U] =のDFN [U] = ++ ティム。 用(int型 ;〜I; I =ヘッド[U] I = E [i]は.nex){ int型、V = E [I] .V。 もし(!{[V] DFN) tarjan(V、U)。 低[U] = 分(低[U]、[V]低いです)。 もし PX [++ CNT] = U、PY [CNT] =([U] <低[V] DFN)、V。 他{ int型のx =検索(U)、Y = (V)を求めます。 もし(!X = Y)FA [X] = yと、 } }他 場合(!V =パー)低[U] = 分(低[U]、[V] DFN)。 } } int型のmain(){ scanf関数(" %D%dの"、&N、&M)。 memsetの(頭、 - 1、はsizeof(ヘッド));ティム= 0 。 memset(DFN、0、はsizeof (DFN))。 以下のために(int型 I = 1 ; I <= M; iは++ ){ int型 V、Uと、scanf関数(" %D%dの"、&U、およびV)。 ADDE(U、V); ADDE(V、U)。 } のために(int型 i = 1 ; iがn = <; iは++)FA [I] = I; CNT = 0 。 tarjan(1 - 1 )。 memsetの(ハッシュ、 - 1、はsizeof(ハッシュ)); NCNT = 0 。 以下のために(int型 i = 1 ; iが<= N; iは++ ){ int型のx = 見つける(I)。 もし(ハッシュ[X] == - 1)ハッシュ[X] = ++ NCNT。 } のための(int型 i = 1 ; iが= CNTを<; Iは++ ){ D [ハッシュ[(PX [I])]検索]++; D [ハッシュ[検索(PY [I])]] ++ ; } INT ANS = 0 。 以下のために(int型私= 1 ; I <= NCNT; iが++ ){ 場合(D [i]の==は1)++ ANS 。 } のprintf(" %d個の\ n "、(ANS + 1)/ 2 )。 }