チャレンジ一覧に戻る
中級 0件解決済み 正答率0%

Can We Split Into Two Teams?

Decide whether people can be assigned to two teams so that each listed pair is on opposite teams.

このチャレンジで学べること

  • 人と対立をグラフで表す
  • 2 色で二部グラフか判定する
  • グラフの連結していない部分を扱う

問題

Decide whether people can be assigned to two teams so that each listed pair is on opposite teams. Every person receives exactly one team; either team may be empty. People without a listed pair can go on either team. Check every connected group of constraints.

Implement split_into_two_teams(people, pairs).

Input

people: The number of people, numbered from 1.

pairs: Rows [first_person, second_person] that must be separated.

Output

Return true if any valid assignment exists, otherwise false. Do not return the assignment.

制約

1 ≤ people ≤ 100,000. 0…200,000 pairs of distinct person IDs in 1…people. Duplicate pairs are allowed and repeat the same constraint.

例

例 1
入力:
pairs = [
    [1, 2],
    [2, 3],
    [3, 1]
]
people = 3

期待される出力:
expected = False
入力:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3},
    {3, 1}
};
long long people = 3;

期待される出力:
bool expected = false;
入力:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3},
    new long[] {3, 1}
};
long people = 3;

期待される出力:
bool expected = false;

解説

If 1 is on team A, 2 must be on B, and 3 must be on A. The last pair then violates the rule.

例 2
入力:
pairs = [
    [1, 2],
    [2, 3]
]
people = 4

期待される出力:
expected = True
入力:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3}
};
long long people = 4;

期待される出力:
bool expected = true;
入力:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3}
};
long people = 4;

期待される出力:
bool expected = true;

解説

Put 1 and 3 on team A and 2 on team B. Person 4 can join either team.

解き方のヒント

まずは自分で考えてから、ヒントを 1 つずつ開いてみましょう。

ヒント 1

各制約成分を2色で塗り分けられるとき、そしてそのときだけ可能です。

ヒント 2

各連結成分をたどり、各ペア制約に沿ってチームを交互に割り当てます。

ヒント 3

奇数サイクルで同じ人に両方のチームを要求するなら、答えは false です。

目安の計算量

時間 O(people + pairs)、追加メモリ O(people + pairs)

参考資料

この課題はCodeUtility用に調整されています。上記の説明と制約に従ってください。

他の人の解答から学ぶ

コミュニティの解答

まだ公開された解答がありません。この課題を解いて最初の解答を共有しましょう。