Back to challenges
Medium 0 solved 0% acceptance

Can We Split Into Two Teams?

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

What you'll learn

  • Model people and conflicts as a graph
  • Check bipartiteness with two colors
  • Handle disconnected parts of a graph

Problem

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.

Constraints

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

Examples

Example 1
Input:
pairs = [
    [1, 2],
    [2, 3],
    [3, 1]
]
people = 3

Expected output:
expected = False
Input:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3},
    {3, 1}
};
long long people = 3;

Expected output:
bool expected = false;
Input:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3},
    new long[] {3, 1}
};
long people = 3;

Expected output:
bool expected = false;

Explanation

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

Example 2
Input:
pairs = [
    [1, 2],
    [2, 3]
]
people = 4

Expected output:
expected = True
Input:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3}
};
long long people = 4;

Expected output:
bool expected = true;
Input:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3}
};
long people = 4;

Expected output:
bool expected = true;

Explanation

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

How to approach it

Try on your own first, then open one hint at a time.

Hint 1

This is possible exactly when every constraint component can be colored with two different colors.

Hint 2

Traverse each connected component and alternate team assignments across each pair constraint.

Hint 3

If you ever need to give the same person both teams through an odd cycle, the answer becomes false.

Expected complexity

O(people + pairs) time, O(people + pairs) extra space

References

This challenge is adapted for CodeUtility. Follow the statement and constraints above.

Learn from others

Community solutions

No published solutions yet. Solve this challenge to share the first one.