Cod sursa(job #687593)

Utilizator mateiuliIulian mateiuli Data 22 februarie 2012 16:41:39
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 4.28 kb
//#include <iostream>
#include <fstream>
#include <vector>

#define NMAX 100
#define INF 9876543

using namespace std;

// noduri si muchii
int N, M;

/*
	@ In graf valorile sunt tinute asa Graf[1] = lista de adiacenta a nodului 1
	@ fiecare element din lista aia e de tipul nodGraf => Graf[1][2].dist = distanta dintre nodul 1 si
	@ elementul care se alfa pe pozitia 2 in lista de adiacenta a nodului 1
*/
// trebuie sa stochez si nodul vecin si distanta dintre ele
struct nodGraf {
	int nodVecin;
	int dist;
} tmp;
// declar un vector de tipul nodGraf
//vector<nodGraf> Graf[NMAX];
vector<int> row(NMAX, INF);
vector< vector<int> > Graf(NMAX, row);
//int Graf[100][100];

// structuri de date pt Dijkstra
int	 distanta[NMAX];			// distanta de la nodul de plecare la nodul k
bool vizitat[NMAX];				// o multime in care pun elementele vizitate
int	 tata[NMAX];				// in nodul p vin din nodul tata[p]

// iteratori
vector<int> :: iterator it;

// nodul de start
int nodStart = 1;

// functii locale
void citire();
void debug();
void init();
void dijkstra();

int main() {
	// aloc zone de memorie pt structurii dijkstra
	//distanta.reserve(N+1);
	//tata.reserve(N+1);
	//memset(Graf, INF, sizeof(Graf));
		
	citire();
	init();
	//debug();
	
	dijkstra();
	
	ofstream fout("dijkstra.out");
	for(int i=2; i<=N; i++) {
		fout<<distanta[i]<<' ';
	}
	fout.close();
	
	/*
	for(int i=2; i<=N; i++) {
		cout<<"Distanta minima de la "<<nodStart<<" la "<<i<<" este "<<distanta[i]<<'\n';
	}
	cout<<'\n';
	for(int i=1; i<=N; i++)
		cout<<distanta[i]<<" ";
	cout<<'\n';
	for(int i=1; i<=N; i++)
		cout<<tata[i]<<" ";
	cout<<'\n';
	*/
}

void init() {
	// initialez toate distantele din dist cu infinit mai putin nodul de start
	//fill(distanta.begin(), distanta.end(), -INF);
	distanta[nodStart] = 0;
	
	// umplu vectorul tata cu -1 - o valoare necunoscuta
	//tata[nodStart] = 0;
	
	// adaug in multimea nodurilor vizitate nodul de inceput
	vizitat[nodStart] = true;

	//for(k = Graf[nodStart].begin(); k != Graf[nodStart].end(); ++k) {
	/**for(int l=0; l<Graf[nodStart].size(); l++) { 
		distanta[Graf[nodStart][l].nodVecin] = Graf[nodStart][l].dist;
		tata[Graf[nodStart][l].nodVecin] = nodStart;
	}*/
	
	for(int i=1; i<=N; i++) {
		distanta[i] = Graf[nodStart][i];
		tata[i]		= nodStart;
	}

}

void dijkstra() {
	// nodul curent si drumul minim gasit de la nodStart la nodCurent
	int drumMinim, nodCurent = 1;
	
	// se repeta de n-1 ori
	for(int j=1; j<N; j++) {		
		// pp ca cel mai scurt drum e infinit
		drumMinim = INF;
		
		// caut cea mai mica distanta a unui nod nevizitat
		for(int i=1; i<=N; i++) {
			// daca nodul nu e vizitat si distanta e minima
			if(!vizitat[i] &&  distanta[i] < drumMinim) {
				drumMinim = distanta[i];
				nodCurent = i;
			}
		}
		//cout<<drumMinim<<" "<<nodCurent<<" | ";
		
		// am gasit nodul minim si o distanta minima 
		vizitat[nodCurent] = true;
		
		// actualizez distantele de la nodul curent la fiecare dintre nodurile vecine daca merge
		for(int i=1; i<=N; i++) {
			// daca nodul pe care il actualizez nu e vizitat
			// si daca am gasit o distanta mai mica 
			
			if(!vizitat[i] && distanta[i] > drumMinim + Graf[nodCurent][i]) {
				// in nodul i vin din nodul curent
				tata[i] = nodCurent;
				// am gasit o distanta minima
				distanta[i] = drumMinim + Graf[nodCurent][i];
			}
		}
	}
}

void citire() {
	ifstream fin("dijkstra.in");
	fin>>N>>M;
	int a, b, c;
	
	vector<int> aux;
	
	for(int i=1; i<=M; i++) {
		fin>>a>>b>>c;
		// graful e orientat
		
		// salvez nodul vecin
		//tmp.nodVecin = b;
		
		// salvez distanta de la a la nodul vecin
		//tmp.dist = c;
		
		//aux.push_back(c);
		
		// salvez nodul in array
		//Graf[a].push_back(tmp);
		
		Graf[a][b] = c;
	}
	fin.close();
}

void debug() {
	// itearator
	/*vector<nodGraf>::iterator i;
	for(int nod = 1; nod <= N; nod++) {
		cout<<nod<<" -> ";
		for(i = Graf[nod].begin(); i != Graf[nod].end(); ++i)
			cout<<i->nodVecin<<":"<<i->dist<<", ";;
			//cout<<nod<<' '<<i->nodVecin<<' '<<i->dist<<'\n';
		cout<<'\n';
	}
	
	cout<<'\n';
	for(int i=1; i<=N; i++) {
		for(int l=0; l<Graf[i].size(); l++) { 
			cout<<"Dist de la "<<i<<" la "<<Graf[i][l].nodVecin<<" este "<<Graf[i][l].dist<<'\n';
		}
	}*/
}