Antonio è in viaggio, e ha una tabella di distanze tra città.
Su di essa, purtroppo, non compare la distanza tra la sua città di partenza e quella di arrivo, per raggiungere la quale bisogna passare per altre città intermedie.
Dovete aiutare Antonio a trovare la distanza relativa al percorso più breve tra la città di partenza e quella di arrivo desumibile dalla tabella.
Dati in input
Il file input.txt è costituito da una prima riga nella quale sono indicati, separati da un carattere spazio, il numero totale di città in tabella N e il numero di distanze mutue tra due città D.
Seguono D righe, ciascuna delle quali contiene gli identificatori numerici delle due città e la loro mutua distanza, separati da un carattere spazio.
Dati in output
Il programma, dopo aver letto il file di input, deve calcolare la distanza minima tra la città di partenza e quella di arrivo, e scriverla su un file di nome output.txt.
Più precisamente, il file output.txt deve essere costituito da una sola riga, contenente un numero intero che rappresenta la distanza più breve tra la città di partenza e quella di arrivo.
Assunzioni
- Il numero N di città è inferiore a 1000
- Il numero di distanze è D inferiore a 10000
- Gli identificatori delle città sono interi compresi tra 1 e N.
- La città di partenza e la destinazione sono sempre associate agli identificatori 1 e 2, rispettivamente.
Esempi di input/output
input.txt | output.txt |
5 6 1 3 15 3 2 35 1 4 20 4 5 15 3 5 30 4 2 55 |
50 |
/* wwww.valcon.it OII 2001 - Olimpiadi nazionali - DISTANZE */ #include#include #include #include using namespace std; #define NMAX 1000 // n. massimo di città #define PARTENZA 1 // la città di partenza #define DESTINAZIONE 2 // la città destinazione #define INFINITA -1 // la distanza delle città non visitate struct INFO { int dest, dist; }; // una destinazione con distanza vector citta[NMAX+1]; // le città con i collegamenti int distanze[NMAX+1]; // la distanza minima per ogni città queue visitare; // la coda delle città da visitare int main() { ifstream fin ( "input.txt"); ofstream fout("output.txt"); int N, // numero di città D; // numero di collegamenti fin >> N >> D; int partenza, destinazione, distanza; for(int i=1; i <= D; i++) { fin >> partenza >> destinazione >> distanza; INFO info; info.dist=distanza; info.dest=destinazione; citta[partenza ].push_back(info); info.dest=partenza; citta[destinazione].push_back(info); } for(int i=1; i <= N; i++) // tutte le città hanno distanza infinita distanze[i]=INFINITA; distanze[PARTENZA]=0; // tranne quella di partenza /* DEBUG for(int i=1; i <= N; i++) { for(int j=0; j < citta[i].size(); j++) cout << i << '-' << citta[i][j].dest << ": " << citta[i][j].dist << endl; } for(int i=1; i <= N; i++) cout << distanze[i] << ' '; */ visitare.push(PARTENZA); // comincia con la città di partenza do { partenza=visitare.front(); // preleva una città da visitare visitare.pop(); for(int i=0; i < citta[partenza].size(); i++) // per ogni collegamento { destinazione=citta[partenza][i].dest; distanza =citta[partenza][i].dist; // se è da visitare... if(distanze[destinazione] == INFINITA || distanze[destinazione] > distanze[partenza]+distanza ) { distanze[destinazione]=distanze[partenza]+distanza; // aggiorna la distanza visitare.push(destinazione); // è da visitare } } } while(!visitare.empty()); // finché ci sono città da visitare fout << distanze[DESTINAZIONE]; // la distanza minima della destinazione return 0; }