//三点チャートには、非常に単純に、アイデアで講演:すべてのポイントの最初は、3つのコレクションに分かれています 。//コレクションがセットにヌルポイントすることはできません判断の下では、接続している、そして最終的に低い数字を判断することはできません #を含む<bits./stdc ++ H.> 名前空間STDを使用して、 ロングロングI64のtypedef; のconst int型= 1E5 + MAXN 32; int型N-、M、U、V、COL [MAXN]; SET <整数>グレープ[MAXN]; I64 ARRの[8]; int型のmain() { (偽の)IOSの:: sync_with_stdio; cin.tie(0)、cout.tie(0); CIN >> N-M; I =(I = 0をint型のため! M、Iが++) { ; CIN >> U V ;グレープ[U] .insert(V)を グレープ[V] .insert(U); } COL = 1の[1。]; (I 2 = int型のために、 I <= N;私は++) IF(ぶどう.count(I [1]!)) COL [I] = 1。 (私は2 = int型のため、I <= N-;++ i)は、 私は//にアクセスしない場合、ノード(COL [I]!)場合 { COLは、[i]は= 2; // 2の組検索する ための(INTを1 = J; J ++; J <= N) { IF(!グレープ[I] .count(J)) { IF(COL [J] == 1) { COUT << - << 1 '\ N-'; 0を返す; } COL [J]は2 =; } } ブレーク; } // 2番目のマーク (int型I = 1。; I <= N-;私は++)のための IF(!COL [I]) 。COL [I] = 3; のため(int型I = 1; I <= N-; ++ I) { 用(オートV:グレープ[i])と IF(COL [V] == COL [I]) { COUT << - 1 << 'の\ n'; 0を返します。 } } //集合内的边去重 ための(I = 1をint型、iが<= N; I ++) ++ ARR [COL [I]]。 (!!!ARR [1] || ARR [2] || ARR [3])の場合 はcout << " - 1" << '\ nの'; そうであれば(!(ARR [1] * ARR [2] + ARR [1] * ARR [3] + ARR [2] * ARR [3])= M) COUT << - 1 << "の\ n"。 そうでなければ{ (I = 1をint型++ I; iが<= N)のための COUT << COL [I] <<」「。 coutの<< '\ nの'; } }