Cod sursa(job #793355)

Utilizator RobertSSamoilescu Robert RobertS Data 2 octombrie 2012 18:08:22
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
using namespace std;


const long maxsize =50000;
const long inf = 10000000;
struct graf{
	long nod;
	long cost;
	graf *urm;
};

graf *list[maxsize], *aux, *coada[maxsize];

long n ; // numarul de noduri;
long m; // numarul de linii;
ifstream f("dijkstra.in"); // fisier de intrare
ofstream g("dijkstra.out"); // fisier de iesire

long viz[maxsize], drum[maxsize];

//////////////ADAUGA IN LISTA////////////
inline void add(int a, int b, int c){
	if(list[a]!= NULL){
			aux = new graf;
			aux->urm = NULL;
			aux->nod = b;
			aux->cost = c;
			coada[a]->urm = aux;
			coada[a] = aux;
			
			
		} else{
			list[a] = new graf;
			list[a]->urm = NULL;
			list[a]->nod = b;
			list[a]->cost = c;
			coada[a] = list[a];
		}
		

}

///////////MINIM NEVIZITAT ///////////////

long min_nev(){
	long min = inf;
	long index_min = 0;
	
	for(long i=1; i<=n; i++){
		if(!viz[i] && drum[i]< min){
			min = drum[i];
			index_min = i;
		}
	
	}
	
	return index_min;

}


//////////DJIKSTRA ////////////
inline void djikstra(){
	viz[1] = 1;
	drum[1] = 0;
	
	for(long i=2; i<=n; i++)
		drum[i] = inf;
	
	aux = list[1];
	while(aux){
		drum[aux->nod]= aux->cost;
		aux = aux->urm;
	}
	
	while(min_nev()){
		long index_min = min_nev();
		aux = list[index_min];
		viz[index_min] = 1;
		while(aux){
			
			if(!viz[aux->nod]){
				if(drum[aux->nod] > drum[index_min] + aux->cost){
					drum[aux->nod] = drum[index_min] + aux->cost;
				}
			}
			aux = aux->urm;  
		}
	}
	

}




////////// FUNCTIE DE CITIRE //////
inline void read(){
	
	f >> n >> m;
	
	for(long i=1; i<=m; i++){
		long a, b, c;
		f >> a >> b >> c;
		add(a,b,c);
		add(b,a,c);
	}
	f.close();
	
}




int main(){
	read();
	djikstra();
	
	for(long i=2; i<=n; i++)
		cout << drum[i] <<" ";
	
	g.close();
	return 0;
}