Dは非常に友好的です -
この$ 3 $は問題ではない順序を交換して自由である、関係の環を形成するために設定します見つけます。
そして、何気なく最初の$ 2 $コレクションになるために$ 1 $のポイントを聞かせので、この時点でも第二セットの特定の側に属していません。
次いでだけ選択された点と点を見つけ、さらにエッジを有する$ 3 $組のセットポイント、及び第2のセットの第一のセットの偶数側ないこの点があります。
$ 3 $セットを構築して、違法なことができるかを決定します。
決定には、いくつかの方法:
図1は、接続されたエッジのセットを持つことができません
2.すべてのエッジ点の数のいずれかのセットが同じでなければなりません。
3.ポイントの任意のセットを空にすることはできません。
#include <ビット/ STDC ++ H> に#define N 100004 の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN) 名前空間stdを使用。 ベクター<INT> G [N]。 INT vised [N]、TY [N]、CNT [N]。 INTメイン() { // setIO( "入力")。 N INT、M、I、J、フラグ= 0。 scanf関数( "%d個の%のD"、&N、&M)。 用(i = 1; iが<= M; ++ I) { int型、B。 scanf関数( "%D%dの"、&、&B)。 G [A] .push_back(B)。 G [B] .push_back(A)。 } TY [1] = 2; CNT [2] = 1; 用(; iは、G [1] .sizeを(<); I = 0 ++ I) { int型、V = G [1]〜[I]。 ; [V] = 1 vised } (I = 2 ++ I; iが<= n)のための[2]であればTY [I] = 2、++ CNT(vised [I]!)。 //判断2有没有不合法的。 / * ための式(I = 2; iが<= N; ++ I) { IF(TY [I] == 2) { ため(J = 0; J <G [I] .size(); ++ j)は { int型、V = G [I] [J]。 IF(TY [V] == 2)フラグ= 1。 } } } * / //对3染色。 用(i = 1; iは= N <; ++ I) { IF(vised [I]) { ため(J = 0; J <G [I] .size(); ++ J) { int型V = G [I] [J]。 (もし!TY [V]) { TY [V] = 1。 ++ CNT [1]。 } } TY [I] = 3; ++ CNT [3]。 ブレーク; } } のための(i = 1; iが<= N; ++ i)から(!TY [i])とする場合TY [I] = 3、++ CNT [3]。 用(i = 1; iは= N <; ++ I) { IF(TY [I] == 1) { ため(J = 0; J <G [I] .size(); ++ j)は { INT V = G [I] [J]。 IF(TY [V] == 1)フラグ= 1。 } IF(G [i]が.size()= CNT [2] + CNT [3]!)フラグ= 1。 } IF(TY [I] == 2) { ため(J = 0; J <G [I] .size(); ++ J) { int型、V = G [I] [J]。 IF(TY [V] == 2)フラグ= 1。 } IF(G [i]が.size()= CNT [1] + CNT [3]!)フラグ= 1。 } IF(TY [I] == 3) { ため(J = 0; J <G [I] .size(); ++ J) { int型、V = G [I] [J]。 IF(TY [V] == 3)フラグ= 1。 } IF(G [i]が.size()= CNT [1] + CNT [2]!)フラグ= 1。 } } (!TY [i])とフラグ= 1の場合(I ++; iが<= N I = 1)のために、 もしフラグ= 1(CNT [1] || CNT [2] || CNT [3]!!)。 IF(フラグ)のprintf( " - 1つの\ n"); そう { printf( "%dの"、TY [I])は、(i ++; iが<= N I = 1)のために、 } 0を返します。 }