Voltar para os desafios
Médio 0 resolvidos 0% de aceitação

Can We Split Into Two Teams?

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

O que você vai aprender

  • Modelar pessoas e conflitos como um grafo
  • Verificar se é bipartido com duas cores
  • Tratar partes desconectadas de um grafo

Problema

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.

Restrições

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

Exemplos

Exemplo 1
Entrada:
pairs = [
    [1, 2],
    [2, 3],
    [3, 1]
]
people = 3

Saída esperada:
expected = False
Entrada:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3},
    {3, 1}
};
long long people = 3;

Saída esperada:
bool expected = false;
Entrada:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3},
    new long[] {3, 1}
};
long people = 3;

Saída esperada:
bool expected = false;

Explicação

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

Exemplo 2
Entrada:
pairs = [
    [1, 2],
    [2, 3]
]
people = 4

Saída esperada:
expected = True
Entrada:
std::vector<std::vector<long long>> pairs = {
    {1, 2},
    {2, 3}
};
long long people = 4;

Saída esperada:
bool expected = true;
Entrada:
long[][] pairs = new long[][] {
    new long[] {1, 2},
    new long[] {2, 3}
};
long people = 4;

Saída esperada:
bool expected = true;

Explicação

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

Como abordar

Tente sozinho primeiro e depois abra uma dica de cada vez.

Dica 1

Isso é possível exatamente quando cada componente das restrições pode ser colorido com duas cores diferentes.

Dica 2

Percorra cada componente conectado e alterne as atribuições de time ao longo de cada restrição em par.

Dica 3

Se em algum momento você precisar colocar a mesma pessoa nos dois times por causa de um ciclo ímpar, a resposta vira false.

Complexidade esperada

tempo O(people + pairs), espaço extra O(people + pairs)

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.