Pirotas
(usa Outra)
Enviado em 19/11/2009 - 17:09h
Foi assim que acabei por entregar o trabalho (atenção que para grafos com mais de 100 arestas é necessário alterar a dimensão da matriz e da tabela) (poderá dar erro pois só passou em 15 testes de 18, não há nada perfeito!!!)
Ainda podem ver como passar matrizes bidimensionais por valor, é só olhar o código.
main
[code]
#include "proj1.h"
int main(int argc, char** argv){
int nvertices, narestas, origem, destino;
int matriz[100][3];
int tab[4][110];
int k = 0;
scanf("%d %d", &origem, &destino);
scanf("%d", &nvertices);
scanf("%d", &narestas);
/*organizar a matriz do grafo*/
do{
scanf("%d %d %d", &(matriz[k][0]), &(matriz[k][1]), &(matriz[k][2]));
k++;
}while(k < narestas);
/*organizar a tabela auxiliar*/
k = 0;
for(k = 0; k < narestas; k++){
tab[0][k] = k;/*vertice, indice*/
tab[1][k] = INF;/*custo, indice*/
tab[2][k] = 0;/*bloqueado(0 não/ 1 sim), indice*/
tab[3][k] = 0;/*vertice anterior, indice*/
}
tab[1][origem] = 0;/*origem a zero*/
/*define os parametros de inicio da busca*/
tab[1][origem] = 0;/*define o custo inicial a zero*/
tab[3][origem] = 0;/*o precedente da origem é a origem*/
dijkstra(matriz, destino, origem, nvertices, narestas, tab);
return 0;
}[\code]
proj1.c
[code]
#include "proj1.h"
void dijkstra(int matriz[100][3], int destino, int origem, int nvertices, int narestas, int tab[4][110])
{
int i, j;
int t, p;
int caminho[100];
int prox = 0, min = INF, destino_aresta = 0;
for(t = 0; t < nvertices ; t++){
min=INF;
for(i = 0; i < nvertices; i++){
if((tab[1][i] < min) && (tab[2][i] == 0)){
prox = tab[0][i];/*próximo nó, precedência da origem é a origem*/
min = tab[1][i];/*novo mínimo*/
}
}
tab[2][prox]=1;/*bloquear vértices (linha2)*/
j=0;
while(j < narestas){
if(matriz[j][0] == prox){
destino_aresta = matriz[j][1];
if(min + matriz[j][2] < tab[1][destino_aresta]){/*compara o novo mínimo com o valor da tabela*/
tab[1][destino_aresta] = min + matriz[j][2];/*actualiza o custo até ao momento*/
tab[3][destino_aresta] = prox;/*define qual o vertice anterior*/
}
}
j++;
}
}
printf("custo=%d\n", tab[1][destino]);
/*obter o caminho através da linha dos vertices anteriores da tabela auxiliar*/
i = 0;
p = destino;
while(p != origem){
caminho[i] = p;
i++;
p = tab[3][p];
}
printf("%d",origem);/*imprime a origem*/
/*imprime o resto do caminho*/
for(i--; i != -1; i--){
printf(" %d", caminho[i]);
}
printf("\n");
}
[\code]
proj1.h
[code]
#ifndef PROJ1_H_
#define PROJ1_H_
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INF 999/*valor elevado, tratar como infinito*/
void dijkstra(int matriz[100][3], int destino, int origem, int nvertices, int narestas, int tab[4][110]);
#endif /* PROJ1_H_ */
[\code]