Programmi C / C++ - prof. Claudio Maccherani - Perugia - 2008
Algoritmo di Dijkstra
soluzione in C++ proposta dalla prof.ssa Paola Masin
/* Algoritmo di DIJKSTRA: ricerca cammino minimo su grafo orientato in input sulla prima riga: numero nodi, nodo iniziale, nodo finale nelle righe successive gli archi (terne di: nodo, nodo, peso) si suppongono i nodi numerati a partire da zero. 'maquillage' di Claudio Maccherani, del 2008, di un programma di Paola Masin del 18/12/2006 +-----------+ +--------------------------+ | input.txt | | output.txt | +-----------+ +--------------------------+ | 6 1 5 | | cammino di peso 6 | | 0 1 3 | | percorso a ritroso 5 4 1 | | 0 5 2 | +--------------------------+ | 1 2 5 | | 2 3 1 | | 3 4 3 | | 4 5 2 | | 5 1 6 | | 1 4 4 | +-----------+ */ #include
#include
using namespace std; int main() { // variabili di servizio, dimensionamento, inizializzazione int i,j,k, Inizio, Fine, Min, Attuale; ifstream in("input.txt"); // file di input int n; // numero nodi in>>n; // lettura numero nodi int G[n][n]; // MATRICE di ADIACENZE in>>Inizio; // nodo di partenza in>>Fine; // nodo di arrivo // inizializza matrice adiacenze: se non c'è l'arco, l'elemento vale INT_MAX for (i=0; i
>i; in>>j; in>>G[i][j]; } in.close(); // definizione strutture per l'algoritmo int D[n]; // vettore delle DISTANZE che contiene, per ciascun nodo, // la distanza minima dal nodo iniziale // serve anche come insieme dei nodi di frontiera // (nodi raggiungibili da qualcuno dei precedentemente esaminati) for (i=0; i
D[Attuale] + G[Attuale][i]) { D[i] = D[Attuale] + G[Attuale][i]; P[i] = Attuale; } } //while ofstream out("output.txt"); // file di output if ( V[Fine] == 0) out<<"NON esiste cammino da nodo "<