Cod sursa(job #802148)

Utilizator bixcabc abc bixc Data 25 octombrie 2012 21:58:42
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.37 kb
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;

#define NMAX 100010 
#define INF 0x3f3f3f3f

int N, M;
int dist[NMAX];
vector < pair <int, int> > graph[NMAX];

void read_data () {
	
	scanf ("%d %d", &N, &M);
	
	int x, y, z;
	for (int i = 0; i < M; i++) {
		scanf ("%d %d %d", &x, &y, &z);      
		graph[x].push_back ( make_pair (y, z) );
		graph[y].push_back ( make_pair (x, z) );
	}
}

void dijkstra () {
	
	int node;
	int use[NMAX];
    set < pair <int, int> > S;

	memset (use, 0, sizeof (use));
	memset (dist, INF, sizeof (dist));

	dist[1] = 0; use[1] = 1;    
	S.insert ( make_pair (0, 1) );
	for (int i = 2; i <= N; i++) {
		node = S.begin ()->second;
		S.erase ( S.begin () );
		for (vector < pair <int, int> >::iterator it = graph[node].begin (); it != graph[node].end (); it++) 
			if (dist[it->first] > dist[node] + it->second ) {

				if (use[it->first])
					S.erase ( S.find ( make_pair (dist[it->first], it->first) ) );

				dist[it->first] = dist[node] + it->second;	
				S.insert ( make_pair (dist[it->first], it->first) );
				use[it->first] = 1;
			} 			 
	}	
}

int main () {
	
	freopen ("dijkstra.in", "r", stdin);
	freopen ("dijkstra.out", "w", stdout);
	
	read_data ();
	dijkstra (); 

	for (int i = 2; i <= N; i++)
		if (dist[i] == INF) printf ("0 ");
		else printf ("%d ", dist[i]);

	return 0;
}