Cod sursa(job #387381)

Utilizator runnaway90Oprescu Radu Constantin runnaway90 Data 27 ianuarie 2010 15:37:12
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.03 kb
#include<stdio.h>
#include<vector>
#include<algorithm>

#define mp make_pair
#define pb push_back
#define N 50002
#define INF 0x3f3f3f3f

using namespace std;

int n, m, i, x, y, z, fol[N], sol[N];
vector <pair <int, int> > a[N];

void citire(), bf();

int main(){
	freopen("dijkstra.in","r", stdin);
	freopen("dijkstra.out","w", stdout);

	citire();
	bf();
	for (i = 2; i <= n; i++)
		printf("%d ", (sol[i] != INF ? sol[i] : 0) );
	
	return 0;
}
void citire(){
	scanf("%d %d", &n, &m);
	for (i = 1; i <= m; i++){
		scanf("%d %d %d", &x, &y, &z);
		a[x].pb(mp(y,z));
	}
}

void bf(){
int q[N], p , u;
	q[0] = 1; fol[1] = 1; 
	memset (sol, INF, sizeof(sol));
	sol[1] = 0;
	
	for (p = 0, u = 0; p <= u; p++){
		x = q[p];
		for (vector< pair< int, int> >::iterator it = a[x].begin(); it != a[x].end(); it++)
			if (sol[x] + it->second < sol[it->first]){
				sol[it->first] = sol[x] + it->second;
				if (!fol[it->first]){
					q[++u] = it->first;
					fol[it->first] = 1;
				}
			}
		fol[x] = 0;
	}
}