Ainda usando a mesma representação de grafos vista na aula anterior, vamos implementar no lab de hoje o algoritmo de busca de caminhos mais curtos de Dijkstra, visto em sala na segunda-feira. O esqueleto para a implementação está em grafo.c e o arquivo de interface aqui. Estão disponíveis os mesmos arquivos de entrada grafo5.dat e grafo9.dat e um teste em testecaminho.c.
A função menorescaminhos retorna um novo array contendo, para cada nó j do grafo, qual o último nó visitado no caminho mais curto encontrado de no_inicial até j (A informação sobre o último visitado é suficiente para descobrir todo o caminho da origem até o nó!). O array retornado deve conter uma posição a mais do que o número de nós do grafo, com essa posição contendo o valor -1 (para marcar o final do array).
Para implementar menorescaminhos, utilize um array de chars, visitados, que indique que nós já foram visitados, e um outro array contendo o valor do menor caminho encontrado até agora até cada nó do grafo, além do array a ser retornado.
Vamos fazer a implementação em dois passos:
atenção: Entregue esta versão fazendo upload do arquivo com nome grafo1.c !!!
O custo de encontrar o nó não visitado com menor distância à origem é linear e faz o algoritmo ficar O(n2). Uma forma de diminuir este custo é usar um heap de prioridades para determinar o nó com menor distância a cada passo.
Sua implementação de heap pode ser bem baseada na que foi vista no laboratório 9, mas teremos que fazer algumas modificações. Em grafo.c deixei a declaração da estrutura de heap modificada:
atenção: Entregue esta versão fazendo upload do arquivo com nome grafo2.c !!!