Cod sursa(job #494733)

Utilizator gabipurcaruGabi Purcaru gabipurcaru Data 22 octombrie 2010 18:35:50
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
// infoarena: problema/dijkstra //

#include <fstream>
#include <queue>
#include <vector>

#define MAXN 51000
#define MAXM 251000
#define INF (unsigned long)1<<31
using namespace std;

ifstream in("dijkstra.in");
ofstream out("dijkstra.out");

unsigned long n,m,i,j,a,b,c,len[MAXM],fin[MAXM],dist[MAXN],next;
struct cmp
{
	inline bool operator() (unsigned long a, unsigned long b) const
	{
		return dist[a] >= dist[b];
	}
};
vector<unsigned long> g[MAXN];
vector<unsigned long>::iterator it;
priority_queue<unsigned long, vector<unsigned long>, cmp > q;
bool viz[MAXN];

int main()
{
	in>>n>>m;

	for(i=1; i<=m; ++i)
	{
		in>>a>>b>>c;
		g[a].push_back(i);
		len[i]=c;
		fin[i]=b;
	}
	viz[1]=true;
	for(i=2; i<=n; ++i)
		dist[i] = INF;

	for(it=g[1].begin(); it!=g[1].end(); it++)
		{ dist[fin[*it]] = len[*it]; q.push(fin[*it]); }

	while(!q.empty())
	{
		next = q.top();
		q.pop();

		//if(viz[next])
		//	continue;

		for(it=g[next].begin(); it!=g[next].end(); ++it)
			if(!viz[fin[*it]] && dist[fin[*it]] > dist[next]+len[*it])
				{ dist[fin[*it]] = dist[next]+len[*it]; q.push(fin[*it]); }

		viz[next]=true;
	}
	for(i=2; i<=n; ++i)
		out<<(dist[i]!=INF ? dist[i] : 0)<<' ';

	return 0;
}