Suponha que você tenha um conjunto de conjuntos de números inteiros. É possível que alguns dos conjuntos se sobreponham (isto é, compartilhando elementos). Você pode se livrar das sobreposições excluindo elementos dos conjuntos, mas alguns deles podem acabar vazios; isso seria uma vergonha. Podemos tornar todos os conjuntos disjuntos sem esvaziar nenhum deles?
Observe que, nessa situação, nunca há motivo para deixar vários elementos em um conjunto; portanto, esse problema sempre pode ser resolvido reduzindo-se cada conjunto a apenas um elemento. Essa é a versão do problema que estamos resolvendo aqui.
A tarefa
Escreva um programa ou função, da seguinte maneira:
Entrada : uma lista de conjuntos de números inteiros.
Saída : uma lista de números inteiros, do mesmo tamanho que a entrada, para a qual:
- Todos os números inteiros na saída são distintos; e
- Cada número inteiro na saída é um elemento do conjunto correspondente da entrada.
Esclarecimentos
- Você pode representar um conjunto como uma lista, se desejar (ou o que for apropriado para o seu idioma), desconsiderando a ordem dos elementos.
- Você não precisa lidar com o caso em que não existe solução (ou seja, sempre haverá pelo menos uma solução).
- Pode haver mais de uma solução. Seu algoritmo sempre deve produzir uma solução válida, mas pode ser não determinístico (ou seja, tudo bem se ele escolher uma solução válida diferente toda vez que for executado).
- O número de números inteiros distintos que aparecem na entrada, n , será igual ao número de conjuntos na entrada e, por simplicidade, serão os números inteiros de 1 a n, inclusive (já que seus valores reais não importam). Depende de você se você deseja explorar esse fato ou não.
Casos de teste
[{1,2},{1,3},{1,4},{3,4}] -> [2,3,1,4] or [2,1,4,3]
[{1,3},{1,2,4},{2,3},{3},{2,3,4,5}] -> [1,4,2,3,5]
[{1,3,4},{2,3,5},{1,2},{4,5},{4,5}] -> [1,3,2,4,5] or [3,2,1,4,5] or [1,3,2,5,4] or [3,2,1,5,4]
Condição de vitória
Um programa requer uma complexidade de tempo ideal para vencer, ou seja, se um algoritmo com uma complexidade de tempo melhor for encontrado, desqualifica todas as entradas mais lentas. (Você pode supor que os componentes internos do seu idioma sejam executados o mais rápido possível, por exemplo, você pode assumir que um componente ordenado seja executado no tempo O (n log n). Da mesma forma, suponha que todos os números inteiros de tamanho comparável a n possam ser adicionados, multiplicados, etc. em tempo constante.)
Como é provável que seja fácil obter uma complexidade de tempo ideal na maioria dos idiomas, o vencedor será, portanto, o programa mais curto entre aqueles com complexidade de tempo vencedora, medidos em bytes.