Cod sursa(job #405963)

Utilizator dexter_dexMutascu Adrian - Dragos dexter_dex Data 28 februarie 2010 23:37:43
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <stdio.h>
#include <vector>

#define inf 1<<30
#define Nmax 50005

using namespace std;

vector < pair <int, int> > A[Nmax];

long sol[Nmax], d[Nmax], viz[Nmax];
int n, m, i, a, b, c, p, u, nod, l, fiu;

void BFS(){
	
	p = 1;
	u = 1;
	d[p] = 1;
	viz[1] = 1;
	
	while (p <= u){
		nod = d[p];
		l = (int)A[nod].size();
		
		for (i = 0 ; i < l ; i++){
			fiu = A[nod][i].first;
			a = sol[fiu];
			sol[fiu] = min ( sol[nod] + A[nod][i].second, sol[fiu] );
			
			if (a != sol[fiu])
				viz[fiu] = 0;
			
			if (viz[fiu] == 0){
				d[++u] = fiu;
				viz[fiu] = 1;
			}
		}
		
		++p;
	}
}

int main (){
	
	FILE * f = fopen ("dijkstra.in", "r");
	FILE * g = fopen ("dijkstra.out", "w");
	
	fscanf (f, "%d %d", &n, &m);
	for (i = 1 ; i <= m ; i++){
		fscanf (f, "%d %d %d", &a, &b, &c);
		A[a].push_back ( make_pair (b, c) );		
	}
	
	for (i = 2 ; i <= Nmax ; i++)
		sol[i] = inf;
	
	BFS();
	
	for (i = 2 ; i <= n ; i++)
		if (sol[i] != inf )
			fprintf (g, "%d ", sol[i]);
		else 
			fprintf(g, "0 ");
	
	fclose(f);
	fclose(g);
	return 0;
}