Problema F - Book Hand Delivery


Autor: André Restivo (Faculdade de Engenharia da Universidade do Porto)
Tipo de problema: Grafos (caminho mínimo/Dijkstra)

A principal dificuldade do problema é perceber qual a melhor maneira de representar os dados de entrada. Intuitivamente, um grafo aparece como uma estrutura de dados adequada. Mas o que colocar como nós e ligações? A escolha vai influenciar a dificuldade da implementação e a eficiência da solução, que passa por encontrar um caminho mínimo entre duas pessoas.

Vejamos três hipóteses diferentes de representação para os nós (Seja P o número de pessoas):

A segunda hipótese dada é propícia a pequenos erros, e era de evitar. Dado que o número de pessoas máximo é de 1000, a primeira hipótese cria um grafo relativamente grande (7000 nós), pelo que a solução recomendada passa por usar a última hipótese de grafo dada, com apenas 182 nós.

Para descobrir o caminho mínimo podemos usar o clássico (e frequente em concursos) algoritmo de Dijkstra. Tendo em conta que o número de nós é pequeno, bastaria uma implementação quadrática - O(N^2) do algoritmo. Uma vez que se queria o caminho mínimo entre duas pessoas, que não correspondem a nós do 3º grafo, poderíamos por exemplo criar dois nós virtuais, um para a pessoa inicial, outro para a final, com ligações de custo zero para as respectivas actividades/dia.

O autor do problema, o André Restivo, criou um documento com as imagens das três alternativas de representação de grafos:

3 possíveis representações do grafo (PDF produzido por André Restivo, FEUP, o autor do problema)


Ligações interessantes: