PDA

View Full Version : [C] Cammini minimi su grafo non pesato


dhabsot
19-05-2013, 16:47
Salve a tutti, avrei bisogno di una mano con l'implementazione di un algoritmo che calcoli il cammino minimo tra i vertici su grafo non pesato.
Avevo pensato di utilizzare Dijkstra impostando il peso di ogni arco uguale a 1 (e fin qui penso di esserci), il programma l'ho finito ma solo ora mi accorgo che alcuni grafi non li "digerisce", mi spiego:

Se, ad esempio, prendessi in considerazione questo grafo:
http://oi42.tinypic.com/9untad.jpg
Tutto funziona perfettamente, ogni percorso è ok...

Se invece prendo quest'altro grafo:
http://oi39.tinypic.com/244s406.jpg
l'output che ottengo è:
Percorso piu' breve tra il nodo 0 e il nodo 3:
0 -> 4 -> 2 -> 3, con il costo di 3

distanza dal nodo 0 = 0, padre del nodo 0 = -1
distanza dal nodo 1 = 1, padre del nodo 1 = 0
distanza dal nodo 2 = 2, padre del nodo 2 = 4
distanza dal nodo 3 = 3, padre del nodo 3 = 2
distanza dal nodo 4 = 1, padre del nodo 4 = 0

Cosa assolutamente sbagliata in quanto il nodo 4 è direttamente collegato al nodo 3 e il nodo 2 non è collegato al nodo 3 (è il contrario...).

Parte del codice:

typedef struct nodo
{
int valore,
peso_arco,
precedente;
struct nodo *succ;
}nodo_t;

typedef struct nodo0
{
int valore;
struct nodo0 *succ;
}nodo0_t;

int acquisisci_grafo(nodo_t *G[])
{
int i,
n;
FILE *file_dati;

file_dati = fopen("file_dati.txt",
"r");
if (fscanf(file_dati,
"%d",
&n) != 1); /* Acquisizione numero vertici */

for (i = 0; (i < n); i++)
{
int j,
nr_nodi_adiacenti;
nodo_t *p,
*testa;

if (fscanf(file_dati,
"%d",
&nr_nodi_adiacenti) != 1); /* Numero di elementi adiacenti al nodo i */

testa = NULL;

for (j = 0; (j < nr_nodi_adiacenti); j++)
{
p = malloc(sizeof(nodo_t));

p -> peso_arco = 1; /* Set del peso di ogni arco a 1 */

if (fscanf(file_dati,
"%d %d",
&p -> precedente,
&p -> valore) != 1);

p -> succ = testa;

testa = p;
}
G[i] = testa;
}
fclose(file_dati);

return(n);
}


e da file gli ho dato in input:
5
2
0 1
0 4
1
1 2
3
4 1
4 2
4 3
0
2
3 2
3 0

Qualcuno può aiutarmi? Cosa c'è di sbagliato nell'acquisizione?
Grazie mille anticipatamente!




EDIT: Risolto, il problema era nel file che gli davo in input, corretto quello funziona tutto perfettamente!