Cod sursa(job #475889)

Utilizator Addy.Adrian Draghici Addy. Data 8 august 2010 23:41:50
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
#include <cstdio>
#include <vector>

using namespace std;

#define NMAX 50050
#define INF 1 << 30

int C[NMAX], H[NMAX], poz[NMAX], n, m, N;
vector < pair <int, int> > G[NMAX];

void read ();
void up_heap (int);
void down_heap (int);
void delete_heap (int);
void dijkstra_heap ();
void print_sol ();

int main () {
	
	freopen ("dijkstra.in", "r", stdin);
	freopen ("dijkstra.out", "w", stdout);
	
	read ();
	
	dijkstra_heap ();
	
	print_sol ();
	
	return 0;
}

void read () {
	
	int i, x, y, c;
	
	scanf ("%d %d", &n, &m);
	for (i = 1; i <= m; i++) {
		scanf ("%d %d %d", &x, &y, &c);
		G[x].push_back (make_pair (y, c));
	}
}

void up_heap (int k) {
	
	int t, c, aux;
	
	t = k >> 1, c = k;
	while (t > 0 && C[H[c]] < C[H[t]]) {
		aux = H[c], H[c] = H[t], H[t] = aux;
		poz[H[c]] = c, poz[H[t]] = t;
		
		c = t, t = c >> 1;
	}
}

void down_heap (int k) {
	
	int t, c, aux;
	
	t = k, c = k << 1;
	if (c < N && C[H[c+1]] < C[H[c]]) c++;
	
	while (c <= N && C[H[t]] > C[H[c]]) {
		aux = H[c], H[c] = H[t], H[t] = aux;
		poz[H[c]] = c, poz[H[t]] = t;
		
		t = c, c = t << 1;
		if (c < N && C[H[c+1]] < C[H[c]]) c++;
	}
}

void delete_heap (int k) {
	
	H[k] = H[N], poz[H[k]] = k;
	N--;
	
	down_heap (k);
}

void dijkstra_heap () {
	
	int nod, fiu, cost, i;
	
	for (i = 2; i <= n; i++)
		C[i] = INF;
	
	N++;
	H[1] = 1, poz[H[1]] = 1, C[1] = 0;
	
	while (N) {
		nod = H[1];
		delete_heap (1);
		
		for (i = 0; i < (int) G[nod].size(); i++) {
			fiu = G[nod][i].first, cost = G[nod][i].second;
			if (C[nod] + cost < C[fiu]) {
				C[fiu] = C[nod] + cost;
				
				if (!poz[fiu]) {
					N++, H[N] = fiu, poz[fiu] = N;
					up_heap (N);
				}
				else
					up_heap (poz[fiu]);
			}
		}
	}
}

void print_sol () {
	
	int i;
	
	for (i = 2; i <= n; i++)
		printf ("%d ", C[i] != INF ? C[i] : 0);
}