Problema C - Jardim Remoto

Há no fundo do horizonte um jardim muito remoto que é conhecido pela quantidade enorme de plantas. Há exatamente N plantas, numeradas de 1 a N, sendo que cada uma está plantada num canteiro próprio. Os diferentes canteiros estão ligados por M trilhos. Cada trilho une dois canteiros distintos e há no máximo um trilho entre dois canteiros. É possível ir de um canteiro até qualquer outro seguindo os trilhos.

Parte I

Pretende-se dividir os canteiros em dois grupos que obedecem a uma restrição particular: se dois canteiros estão no mesmo grupo, então não existe nenhum trilho entre eles (nota que podem existir trilhos entre canteiros de grupos diferentes). Infelizmente nem sempre é possível fazer esta divisão, a tua tarefa é determinar se é possível ou não.

Exemplo

Se N = 4, M = 4 e tivermos os seguintes trilhos: (1, 2) (ou seja, há um trilho entre o canteiro 1 e 2), (2, 3), (3, 4), (4, 1), podemos agrupar os canteiros 1 e 3 num grupo e os canteiros 2 e 4 noutro, logo a resposta para este caso de teste é "sim".

A seguinte figura ilustra este caso:

Se N = 4, M = 4 e tivermos os seguintes trilhos: (1, 2), (1, 4), (2, 3), (2, 4), não há forma válida de agrupar estes canteiros, logo a resposta é "não".

A seguinte figura ilustra este caso:

Restrições:

São garantidos os seguintes limites em todos os casos de teste desta parte que irão ser colocados ao programa:

1 ≤ N ≤ 104 Número de canteiros
N - 1 ≤ M ≤ 5 · 104 Número de trilhos

Os casos de teste desta parte do problema estão organizados em 2 grupos com restrições adicionais diferentes:

Grupo Número de Pontos Restrições adicionais
1 10 1 ≤ N ≤ 10, 1 ≤ M ≤ 45
2 30
-

Parte II

Uma floresta de canteiros é um conjunto de canteiros que obedece à seguinte propriedade: entre dois canteiros do conjunto existe no máximo um caminho usando apenas trilhos entre canteiros do conjunto (uma maneira mais formal de dizer isto é que subgrafo induzido pelos canteiros do conjunto é acíclico). Pretendemos encontrar uma floresta com pelo menos K canteiros.

Um conjunto de ciclos de canteiros é um conjunto de conjuntos ordenados de canteiros, onde os conjuntos ordenados de canteiros obedecem à seguinte propriedade: existe um trilho entre cada canteiro consecutivo do conjunto assim como um trilho entre o primeiro e o último canteiros (uma maneira mais formal de dizer isto é que formam um ciclo não necessariamente induzido). Adicionalmente, cada canteiro pode aparecer no máximo num dos conjuntos. Pretendemos encontrar um conjunto de ciclos de canteiros com pelo menos N - K canteiros usados (ou seja, a soma do número de canteiros em cada conjunto ordenado é pelo menos este valor).

Nem sempre é possível encontrar um destes por isso só é necessário encontrar um dos dois, isto é, a tua tarefa é encontrar uma floresta de canteiros com pelo menos K canteiros OU um conjunto de ciclos de canteiros com pelo menos N - K canteiros (mesmo que encontres dois, só deves reportar um).

Exemplo

Suponhamos que N = 5, M = 6 e tivermos os seguintes trilhos: (1, 2), (1, 4), (2, 3), (2, 4), (3, 4), (4, 5).

A seguinte figura ilustra este caso:

Se K = 3 podemos escolher a seguinte floresta de canteiros com 3 canteiros: 3, 4, 5.

Se K = 4 podemos escolher o conjunto de ciclos que contém apenas um ciclo de comprimento 3 usando os canteiros: 2, 3, 4 (por esta ordem).

Restrições:

São garantidos os seguintes limites em todos os casos de teste desta parte que irão ser colocados ao programa:

1 ≤ N ≤ 104 Número de canteiros
N - 1 ≤ M ≤ 5 · 104 Número de trilhos
1 ≤ K ≤ N - 1 Valor objetivo

Os casos de teste desta parte do problema estão organizados em 3 grupos com restrições adicionais diferentes:

Grupo Número de Pontos Restrições adicionais
3 10 1 ≤ N ≤ 1 000, 1 ≤ M ≤ 5 000, K ≥ N - 2
4 20 1 ≤ N ≤ 1 000, 1 ≤ M ≤ 5 000
5 30
-

Sumário de subtarefas

Os casos de teste do problema estão organizados em 4 grupos com restrições adicionais diferentes:

Grupo Número de Pontos Parte Restrições adicionais
1 10 Parte I 1 ≤ N ≤ 10, 1 ≤ M ≤ 45
2 30 Parte I
-
3 10 Parte II 1 ≤ N ≤ 1 000, 1 ≤ M ≤ 5 000, K ≥ N - 2
4 20 Parte II 1 ≤ N ≤ 1 000, 1 ≤ M ≤ 5 000
5 30 Parte II
-

Input

Nota: O formato de input é difere entre as duas partes.

Nota 2: Este problema é multiteste, o que significa que o vosso programa deve ler e resolver vários casos de teste de uma vez.

A primeira linha contém um inteiro P, que representa a parte que o caso de teste representa. Se for 1, então o caso de teste refere-se à Parte I, se for 2 então refere-se à Parte II.

Segue-se uma linha com um inteiro, T que representa o número de casos de teste. T será no máximo 15. Seguem-se T blocos de linhas com o seguinte formato cada:

Para a Parte I, vem primeiro uma linha com dois inteiros separados por espaços, primeiro N, representando o número de canteiros, seguido de M, o número de trilhos. Na Parte II esta linha tem três inteiros separados por espaços, N, M e K, o valor objetivo.

Seguem-se M linhas, cada uma contendo dois inteiros separados por espaços, os índices dos dois canteiros que este trilho une.

É garantido que o conjunto de trilhos é conexo, não há trilhos repetidos e não há trilhos de um canteiro para ele próprio.

Output

Parte I

O output deve conter uma linha por cada caso de teste com a palavra "sim", caso a divisão seja possível, ou "nao" (sem acento), caso não seja.

Parte II

Para cada caso de teste, o output deve começar com uma frase, ou "floresta", caso queiram reportar uma floresta de canteiros, ou "ciclos", caso queiram reportar um conjunto de ciclos.

Se a vossa resposta for inválida, por exemplo, a floresta que indicam não é uma floresta, um ciclo não é um ciclo válido, o tamanho da floresta ou do conjunto de ciclos é pequeno de mais, então o resultado do vosso programa será Resposta Errada.

Input do Exemplo 1

1
2
4 4
1 2
2 3
3 4
4 1
4 4
1 2
2 3
3 4
4 2

Output do Exemplo 1

sim
nao

Explicação do Exemplo 1

Este exemplo corresponde ao exemplo da Parte I mencionado no enunciado.

Input do Exemplo 2

2
2
5 6 3
1 2
1 3
2 3
2 4
3 4
4 5
5 6 4
1 2
1 3
2 3
2 4
3 4
4 5

Output do Exemplo 2

floresta
3
3 4 5
ciclos
1
3 2 3 4

Explicação do Exemplo 2

Este exemplo corresponde ao exemplo da Parte II mencionado no enunciado.


Final Nacional das ONI'2021
Prova Online
(15 de Maio de 2021)