Cod sursa(job #857708)

Utilizator GavrilaVladGavrila Vlad GavrilaVlad Data 18 ianuarie 2013 11:21:42
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <cstdio>
#include <vector>
#include <algorithm>
#include <set>

using namespace std;

#define maxn 50010
#define inf 1000000000

int n, m, nod, fiu, a, b, c, d[maxn], f[maxn];
vector<int> v[maxn], w[maxn];
vector<pair<int, int> > h;

int main()
{
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	
	scanf("%d%d", &n, &m);
	for(int i=1; i<=m; ++i)
	{
		scanf("%d%d%d", &a, &b, &c);
		v[a].push_back(b);
		v[b].push_back(a);
		w[a].push_back(c);
		w[b].push_back(c);
	}
	
	h.push_back(make_pair(0, 1));
	d[1]=0;
	for(int i=2; i<=n; ++i)
		d[i]=inf;
	
	while(h.size()>0)
	{
		nod=h[0].second;
		pop_heap(h.begin(), h.end());
		h.pop_back();
		
		if(f[nod])
			continue;
		
		f[nod]=1;
		
		for(int i=0; i<v[nod].size(); ++i)
		{
			fiu=v[nod][i];
			if(d[nod]+w[nod][i]<d[fiu])
			{
				d[fiu]=d[nod]+w[nod][i];
				h.push_back(make_pair(-d[fiu], fiu));
				push_heap(h.begin(), h.end());
			}
		}
	}
	
	for(int i=2; i<=n; ++i)
		if(d[i]==inf)
			printf("0 ");
		else
			printf("%d ", d[i]);
	
	printf("\n");
	
	return 0;
}