Você está na página 1de 2

Universidade Federal de Viçosa INF610 – Estrutura de dados e algoritmos

Departamento de Informática Trabalho extraclasse


Prof.: Fabio R. Cerqueira 07 de maio de 2011

Tarefa: Implementar o algoritmo de Dijkstra em C++ para encontrar caminho de menor


custo. O programa deve funcionar para qualquer grafo (simples) dado como entrada e
deve dar como saída os custos mínimos, bem como os caminhos relativos a estes custos,
de um vértice (raiz) entrado pelo usuário até todos os outros vértices. O grafo deverá ser
lido de um arquivo texto e a saída também deve ser escrita em um arquivo texto. Os
formatos dos arquivos serão dados a seguir.

Data da entrega: 14 de junho de 2011.

Supondo o grafo abaixo:


u 1 v

10

9
3
s 6
5

1 y
x

O arquivo que representará este grafo terá na primeira linha o número de vértices
seguido do número de arestas. Para o grafo acima teríamos: 5 8. Em seguida, cada linha
representará uma aresta com seu respectivo peso. Cada aresta será identificada pelos
vértices que são ligados pela mesma. Para o grafo acima teríamos em uma das linhas
por exemplo: x 9 v, indicando que há uma aresta que liga os vértices x e v com peso 9.

Entrada exemplo:

Arquivo (grafo)

5 8
s 10 u
s 5 x
u 3 x
u 1 v
x 1 y
s 7 y
x 9 v
y 6 v

No arquivo de saída, para cada caminho, teremos uma linha que começa com o
símbolo ‘>’, indicando que o que vem em seguida é o vértice que se alcança a partir da
raiz entrada pelo usuário, e a seguir o custo mínimo do caminho em questão. Nas linhas

1
seguintes teremos o caminho para se chegar da raiz até o vértice. Este caminho será a
sequência de vértices que o compõem. Supondo que o usuário tenha entrado o vértice s
como o vértice raiz, a saída para o exemplo dado aqui é descrita abaixo.

Saída (relativa à entrada acima, supondo s a raiz):

Arquivo (custos / caminhos)

>v 9
s x u v
>u 8
s x u
>x 5
s x
>y 6
s x y

Obs. 1: Já será fornecida uma estrutura de dados para representar um grafo (será um
hash de listas). Esta estrutura deverá ser mantida. Faz parte do trabalho entendê-la para
então usá-la na implementação do algoritmo de dijkstra. Ou seja, os acréscimos
necessários para concluir o trabalho devem ser inteligentemente integrados à estrutura
fornecida. Caso seja necessária alguma mudança mais profunda nesta estrutura, o aluno
deverá justificar de forma convincente.

Obs. 2: Não serão aceitas funções soltas pelo programa, ou seja, deve-se utilizar o
mesmo paradigma passado aqui, isto é, o paradigma orientado a objetos. Assim, tudo
que você acrescentar deverá ser na forma de classes, métodos e atributos.

Obs. 3: O trabalho deve ser feito individualmente ou em dupla e deve ser entregue por
e-mail. Enviar um único email para frcerqueira@gmail.com com o assunto “INF610 –
TP xxxxx yyyyy” (com xxxxx e yyyyy substituídos pelo número de matrícula dos
autores do trabalho), contendo anexados os códigos em C++ do programa, devidamente
comentados.

Obs. 4: Trabalhos copiados terão a nota dividida entre fornecedor e copiadores.

Obs. 5: Não enviar o programa executável!

Obs. 6: O aluno poderá (a critério do professor) ser chamado para entrevista, momento
em que deverá demonstrar conhecimento do programa que fez.

Obs. 7: Comece o mais cedo possível. Se tiver dúvidas me procure ou mande email.
Não deixe para última hora!