
Autor: Vasco Manquinho (Instituto Superior Técnico)
Tipo de problema: Grafos
Número de ficheiros de teste: 15
Este era, para mim, um dos problemas mais interessantes da MIUP. Era pegar numa "velha" tarefa tantas veves feita, mas dar-lhe o toque adicional de desta vez ter de ser feito de forma muito eficiente, uma vez que o limite de 1,000,000 nós e ligações impedia aproximações "primitivas".
Antes de continuar, deixem-me dizer que o problema geral subjacente é o da descoberta do Fecho Transitivo de um grafo (ou seja, de onde se pode chegar a onde. O algoritmo mais conhecido para isso é o Floyd-Warshall, que necessita de uma matriz de adjacências e gasta O(N^3) em termos temporais. Mas nada disto se aplica com os limites que temos, claro... Em compensação, o problema é mais simples um pouco, no sentido em que apenas queremos conhecer aqueles a qual se pode chegar a partir de todos os outros.
Existiam várias maneiras de fazer este problema, mas irei descrever agora a maneira como fiz que tem a particularidade de correr em O(V+E), ou seja, é linear para este problema.

Logo, para resolver é só detectar os CFL em O(V+E) e a seguir descobrir se apenas existe um CFL sem ligações para si no grafo condensado em O(V+E), novamente.
Ligações interessantes: