Cod sursa(job #793350)

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


const int maxsize = 100;
const int inf = 10000;
struct graf{
	int nod;
	int cost;
	graf *urm;
};

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

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

int 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 ///////////////

int min_nev(){
	int min = inf;
	int index_min = 0;
	
	for(int 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(int i=2; i<=n; i++)
		drum[i] = inf;
	
	aux = list[1];
	while(aux){
		drum[aux->nod]= aux->cost;
		aux = aux->urm;
	}
	
	while(min_nev()){
		int 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(int i=1; i<=m; i++){
		int a, b, c;
		f >> a >> b >> c;
		add(a,b,c);
		add(b,a,c);
	}
	f.close();
	
}




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