この最初の質問は、人々に一般的に退廃的な問題の解決を行います。
それらのメンバーの嫌悪感が推移関係がされていない、一緒にいなかったので、まず私たちは、変換の問題を見て、私たちは、マップを構築するので、グラフのエッジが同時に出席できる2人の騎士を表します。
この時点で、我々は見つける必要がある、唯一の奇数個人が参加することができ奇数リングので、同時に参加することができ、奇数のリングの人々のを、チェーンができません(理由を考える)、および質問の意味サイロの建設後の図が不発で点在しています。彼を必要としないときに、VDCC(ダブルポイント)を縮小。なぜそれを倍にすることによって縮小する必要がありますか?VDCCは、このような性質があるため。
限りVDCC奇数環、全体VDCCにおけるその後の任意の点があるように、少なくとも奇妙環です。
だから我々は、ちょうどすべてのVDCCは、各VDCCのために実行見つける染色ライン上の判断部グラフ。これはない、それは二部グラフはない奇数周図それ以外の場合は奇数環、含有しない二部グラフ図誰がない、必要十分条件であるべきです。
だから、プロセスを要約すると:最初、すべてのVDCCを見つけるtarjan、その後、マップを構築し、その後、決定し、この二重の時点部グラフかどうか、それはその後、二部グラフ、すべてのノードが参加できるこのVDCCある場合。
理由の説明と定理の数に対する上記のプロセス。いくつかの証拠マイクロ染色下に説明次いで、最初に与えられ得ます。
#include <iostreamの> する#include <アルゴリズム> の#include <cmath> の#include <CStringの> する#include <cstdioを> する#include <ベクトル> の#include <キュー> の#include <スタック> の#include < セット > の#include <地図> // の#defineデシベル(x)はCERR << X << "バグ" << ENDL 使用して 名前空間はstd; 構造体EDGE { int型編、NEX; }エッジ[ 20000500 ]。int型 NUM、最初の[ 2000 ]; INTの根、N、M、time_を、頂部、 年、vccnum。int型DFN [ 2000 ]、低[ 2000 ]、STA [ 25000 ]、BL [ 2000 ]、COL [ 2000 ]。 ベクトル < 整数 > VCC [ 2000 ]; BOOL缶[ 2000 ]、[ 1005 ]、[ 1005 ]。 int型読み取り(){ int型の和= 0、F = 1。チャー X = GETCHAR()。 一方、(X < ' 0 ' || X> ' 9 ' ){ 場合(X == ' - ')F = - 1 。 X = GETCHAR()。 } 一方、(X> = ' 0 ' && X <= ' 9 ' ){ 合計 =合計* 10 + X - ' 0 ' 。 X = GETCHAR()。 } 戻り値の和* F。 } ボイドのinit(){ memsetの(最初、0、はsizeof (最初))。 NUM = time_を=人気= vccnum = ANS = 0 。 memsetの(低、0、はsizeof(低いです))。 memset(DFN、0、はsizeof (DFN))。 memset(BL、0、はsizeof (BL))。 以下のために(int型私= 1 ; iが<= N; iが++ )VCC [I] .clear(); memset(CAN、0、はsizeof (CAN))。 memset(COL、0、はsizeof (COL))。 memset(0、はsizeof (a)参照)。 } ボイド追加(int型 ST、int型編){ エッジ[ ++ NUM] .ED = ED。 エッジ[NUM] .nex =最初の[ST]。 最初の[ST] = NUM。 } BOOL BFS(int型 ST、のconst int型{BLN) キュー < INT > Qと、 COL [ST] = 1 。 q.push(ST); 一方、(!q.empty()){ int型のx = q.front(); q.pop()。 以下のために(int型 I =最初の[X]; I; I = エッジ[I] .nex){ int型、Y = エッジ[i]は.ED。 もし(!BL [Y] = BLN)続けます。 もし(COL [Y] == COL [X])リターン 1 ; そう であれば(COL [Y] == - 1 ){ COL [Y] = 3 - COL [X]。 q.push(Y)。 } } } 戻り 0 。 } ボイド tarjan(INT X){ [X] DFN =低[X] = ++ time_を。 STA [ ++トップ] =のX。 以下のために(int型 I =最初の[X]; I; I = エッジ[I] .nex){ int型、Y = エッジ[i]は.ED。 もし(! DFN [Y]){ tarjan(Y)。 低[X] = 分(低[x]は、低[Y])。 もし(低[Y]> = DFN [X]){ VCC [ ++ vccnum] .push_back(X)。 int型のp; 実行{ P = STA [top-- ]。 VCC [vccnum] .push_back(P)。 } 一方(P =!Y)。 } } そうでなければ低[X] = 分(DFN [Y]、[x]は低いです)。 } } int型のmain(){ ながら(1 ){ N =()を読み出し、M =読む(); もし(N == 0 && M == 0)戻り 0 ; その中に(); 以下のために(int型 I = 1 ; I <= M I ++は、X、Y ){ X =読み取り(); yは。= 読み取ります(); [X] [Y]は [Y] [X] = = 1 。 } のために(int型 i = 1 ; iがn = <; I ++ ) のための(INT J = 1 ; J <= nであり、j ++ ){ 場合(I == j)は続けます。 もし([i] [j]は)継続; (i、j)を追加します。 } // DB(1)。 以下のために(int型 I = 1、私は++;;私は<= N ) の場合(!tarjan(I)DFN [I]); // DB(2)。 以下のために(int型 I = 1 ; I <= vccnum; iは++ ){ ための(int型 J = 0 ; J <VCC [I] .size(); J ++ ) BL [VCC [I] [J] = I、COLの[ VCC [I] [J] = - 1 。 もし(BFS(VCC [I] [ 0 ]、I)) 用(INT J = 0 ; J <VCC [I] .size(); J ++ ) [VCC [I] [J]缶 = 1 。 } // DB(3)。 以下のために(int型私は= 1 ; iが<= N;私は++ ) 場合(!することができます[i])とANS ++ ; printf(" %d個の\ n " 、ANS)。 // DB(4)。 } 戻り 0 。 }
証明:限りVDCC奇数環、全体VDCCにおけるその後の任意の点があるように、少なくとも奇妙環です。
カット点が存在するので、奇数の環が存在する場合、まず、ダブルポイントの意味に従って、、、任意の点は、奇数の環上の2点への2つの経路を有することができるように、2つの半分に奇数環、半分点の奇数点の偶数を有する他の半分を有します。
このリングに肯定的な鎖(あるいは自体両面のうち)(これは二重ドット特性に違反しないように)に沿った任意の点は、鎖上のノードの偶数である場合に、前記、およびポイントの奇数を含んでいてもよいですそれらは鎖上の点の偶数個を含有し、環を構成する特異点を含む半リングの奇数であってもよい場合、奇数のハーフリングを鳴らします。
したがって、この点は、奇数リング上になければなりません。
その後、それはポイントを証明しているすべてのために同じように、これらの結論に来ることができます。
QED。
この醜いチャートを許します。
証明:非有向グラフ奇数リング、それは二部グラフはない、そうでなければ有向グラフがあるが、それが奇数の環を含有しない二部グラフです。
画像は半分(パート)ビューである場合、最初に、それは、2つの側面の間、2つの内側面を接続してはならないだけ、奇数のリングならば、我々は仮定しているシーケンシャルxのリング上のノード。1、X 2、X 3、X ...... 2K-。1、Xを設定することを望むかもしれない。1左部分において、X 2右部分Xに3左部分Xで...... 2K。1-左側部分に配置し、その後X 1接続二部グラフが奇数リングが含まれないように側は、二部グラフの定義を満たしません。
最後に、常にポイントがいずれかに起因することはできませんがあるので同様に、奇数リングとイトゥリ場合、あなたは、二部グラフを構築することはできません。
QED。
残りの染色は、また、黒と白の染色として知られています。二部グラフと上記リング奇数関係定理、我々は、競合ラベリング処理がある場合、ノードは、その隣接ノードがカラーコントラストとしてマークさで染色されたときに黒と白の数字がマークされたノードである2つの色を試みMinchのリングが存在し、これは感じるために、独自の図面であってもよいです。