Salve ragazzi. Avrei bisogno di aiuto con il seguente esercizio:
Praticamente devo calcolare il percorso breve tra un vertice sorgente e un vertice destinazione (inseriti entrambi da tastiera). I vertici in questione ovviamente fanno parte di un grafo, e questo grafo è pesato.
Pensavo di risolvere la cosa utilizzando l'algoritmo di Dijkstra, dalle dispense che ho a disposizione:
codice:void dijkstra(vertice grafo t *grafo p, vertice grafo t *sorgente p) { vertice grafo t *vertice p; arco grafo t *arco p; inizializza(grafo p, sorgente p); /*costruisci un insieme per i vertici già considerati (inizialmente vuoto) ;*/ /*costruisci una struttura per i vertici da considerare (inizialmente tutti);*/ while (la struttura non è vuota ) { /*rimuovi dalla struttura il vertice vertice p con distanza min minima;*/ /*inserisci vertice p nell'insieme dei vertici già considerati;*/ for (arco p = vertice p->lista archi p; (arco p != NULL); arco p = arco p->arco succ p) if (/*arco p->vertice adiac p non è nell'insieme dei vertici già considerati*/) riduci(arco p, vertice p); } }codice:void inizializza(vertice_grafo_t *grafo_p, vertice_grafo_t *sorgente_p) { vertice_grafo_t *vertice_p; for (vertice_p = grafo_p; (vertice_p != NULL); vertice_p = vertice_p->vertice_succ_p) { vertice_p->distanza_min = INFINITO; vertice_p->padre_p = NULL; } sorgente_p->distanza_min = 0.0; }Non so bene come svolgere questa parte:codice:void riduci(arco_grafo_t *arco_p, vertice_grafo_t *vertice_p) /* vertice da cui l’arco esce */ { if (arco_p->vertice_adiac_p->distanza_min > vertice_p->distanza_min + arco_p->peso) { arco_p->vertice_adiac_p->distanza_min = vertice_p->distanza_min + arco_p->peso; arco_p->vertice_adiac_p->padre_p = vertice_p; } }
/*costruisci un insieme per i vertici già considerati (inizialmente vuoto) ;*/
/*costruisci una struttura per i vertici da considerare (inizialmente tutti);*/
Qualcuno può aiutarmi?
Perdonate la mia scarsezza in programmazione, è solo il 3° esercizio che svolgo.

Rispondi quotando