Cod sursa(job #363646)

Utilizator iulia609fara nume iulia609 Data 14 noiembrie 2009 00:30:28
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<set>
#include<vector>
using namespace std;

int M;
short int N;
vector< pair<short int, short int> > G[50035];
short int D[50001];
const int inf = 1001;//999999999;
set< pair<short int, short int> > heap;

int main()
{
	short int u, v, c, i, ind = 0, m[50001], minim;
	int j;
	
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	
	scanf("%hd %d", &N, &M);
	for(i = 1; i <= M; i++)
	{
		scanf("%hd %hd %hd", &u, &v, &c); // u->v cost c
		G[u].push_back( make_pair(v, c) );
	}
	
	heap.insert( make_pair(0, 1) );
	for(i = 2; i <= N; i++)
	{
		D[i] = inf;
		heap.insert( make_pair(D[i], i) );
	}
	
	// dijkstra

	for(i = 1; i <= N-1; i++)
	{
		pair<int, int> p = *heap.begin();
		ind = p.second;
		heap.erase(heap.begin()); // sterge radacina
					
		int nr_v = G[ind].size();
		for (j = 0; j < nr_v; j++)
		{
			int v = G[ind][j].first;
			int c = G[ind][j].second;
			if (D[ind] + c < D[v])
			{
				heap.erase(heap.find( make_pair(D[v], v) ));				
				D[v] = D[ind] + c; // relaxare
				heap.insert( make_pair(D[v], v) );
			}
		}
	}
	
	for (i = 2; i <= N; i++)
		if (D[i] == inf)
			printf("0 ");
		else
			printf("%d ", D[i]);
	printf("\n");
	
	return 0;
}