Cod sursa(job #145237)

Utilizator sima_cotizoSima Cotizo sima_cotizo Data 28 februarie 2008 17:06:33
Problema Algoritmul lui Dijkstra Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.06 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;

const long MAX = 50010;
const long inf = 1<<30;

vector< pair<long,long> > G[MAX];
long n,m;
long D[MAX]; 
bool U[MAX];

struct comp {
	int operator()(long x, long y) { return D[x]>D[y]; }
};

priority_queue< long, vector<long>, comp > Q;

void init(long &x) { x=inf; }

long x;

void relaxeaza(pair<long, long> p) { 
	if ( D[p.first] <= D[x]+p.second ) 
		return;
	D[p.first] = D[x] + p.second;
	if ( !U[p.first] ) Q.push(p.first), U[p.first] = true;
}

void dijkstra() {
	for_each(D+2, D+n+1, init);
	D[1] = 0; U[1] = true;
	Q.push(1);
	while ( !Q.empty() ) {
		x = Q.top(); Q.pop();
		for_each(G[x].begin(), G[x].end(), relaxeaza);
	}
}

int main() {
	freopen("dijkstra.in", "r", stdin);
	scanf("%ld %ld", &n, &m);
	for (long i=0; i<m; ++i) {
		long x,y,c;
		scanf("%ld %ld %ld", &x, &y, &c);
		G[x].push_back(make_pair(y,c));
	}

	dijkstra();

	freopen("dijkstra.out", "w", stdout);
	for (long i=2; i<=n; ++i)
		printf("%ld ", D[i]<inf ? D[i] : 0);
	return 0;
}