Cod sursa(job #584754)

Utilizator andunhillMacarescu Sebastian andunhill Data 26 aprilie 2011 16:56:44
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include<cstdio>
#include<queue>
#include<vector>
using namespace std;

#define oo 2147483647
#define to first
#define cost second
#define mp make_pair

FILE  *f = fopen("dijkstra.in","r");
FILE  *g = fopen("dijkstra.out","w");

int d[50001];

struct cmp
{	bool operator ()(int i,int j)
	{	if(d[i] < d[j]) return 1;
		return 0;
	}
};
priority_queue<int,vector<int>,cmp>q;

int main()
{	int i,j,x,y,c;
	int N,M;
	vector<pair<int,int> >a[50001];
	bool in[50001];
	fscanf(f,"%d %d",&N,&M);
	for(i = 1; i <= M; i++)
	{	fscanf(f,"%d %d %d",&x,&y,&c);
		a[x].push_back(mp(y,c));
	}
	for(i = 2; i <= N; i++)
		d[i] = oo , in[i] = 0;
	d[1] = 0; q.push(1); in[1] = 1;
	while(!q.empty())
	{	x = q.top(); q.pop(); in[x] = 0;
		for(int k = 0; k < a[x].size(); k++)
			if(d[a[x][k].to] > d[x] + a[x][k].cost)
			{	d[a[x][k].to] = d[x] + a[x][k].cost;
				if(!in[a[x][k].to])
				{	in[a[x][k].to] = 1; q.push(a[x][k].to); }
			}
	}
	for(i = 2; i <= N; i++)
		if(d[i] != oo) fprintf(g,"%d ",d[i]);
		else fprintf(g,"%d ",0);
	fclose(f);
	fclose(g);
	return 0;
}