Cod sursa(job #406873)

Utilizator GagosGagos Radu Vasile Gagos Data 1 martie 2010 21:05:05
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <vector>
#include <set>

using namespace std;

#define PII pair<int, int>
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define INF 2000000001

int N, M, dist[50005];
vector<PII> G[50005];
set<PII> HEAP;

void dijkstra(int sursa)
{
	int i, j, ind, sz, x, cost;
	set<PII>::iterator head;
	
	for (i = 2; i <= N; ++i)
	{
		dist[i] = INF;
		HEAP.insert( mp(dist[i], i) );
	}
	
	dist[sursa] = 0;
	HEAP.insert( mp(dist[sursa], sursa) );
	for (i = 1; i < N; ++i)
	{
		head = HEAP.begin();
		ind = head->s;
		HEAP.erase(head);
		
		if (dist[ind] == INF)
			return ;
		
		for (sz = G[ind].size(), j = 0; j < sz; ++j)
		{			
			x = G[ind][j].f;
			cost = G[ind][j].s;
			if (dist[ind] + cost < dist[x])
			{
				head = HEAP.find( mp(dist[x], x) );
				HEAP.erase(head);
				dist[x] = dist[ind] + cost;
				HEAP.insert( mp(dist[x], x) );
			}			
		}
	}
}

int main(void)
{
	int i, j, c;
	
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);

	scanf("%d %d", &N, &M);
	for (; M; --M)
	{
		scanf("%d %d %d", &i, &j, &c);
		G[i].pb( mp(j, c) );
		if (i == j)
			for (;;);
	}

	dijkstra(1);
	
	for (i = 2; i <= N; ++i)
		printf("%d ", (dist[i] == INF) ? (0) : (dist[i]) );
	printf("\n");
	
	return 0;
}