Cod sursa(job #771268)

Utilizator ioana26Ioana Andronescu ioana26 Data 25 iulie 2012 12:53:04
Problema Algoritmul lui Dijkstra Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
/*
Dijkstra.
*/

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <stdio.h>
#include <limits.h>

#define MAXN	50001

using namespace std;

int nr_noduri, nr_muchii;
vector< pair <int, int> > graf[MAXN];
queue<int> coada;
int drum[MAXN];
bool marcat[MAXN];

void drum_min () {
	int i;
	for (i = 1; i <= nr_noduri; i++) 
		drum[i] = INT_MAX;

	drum[1] = 0;
	coada.push(1);
	marcat[1] = true;

	while (!coada.empty()) {
		int u = coada.front();
		coada.pop();
		marcat[u] = false;

		vector< pair<int, int> >::iterator v = graf[u].begin();
		while (v != graf[u].end()) {
			if (drum[u] + v->second < drum[v->first]) {
				drum[v->first] = drum[u] + v->second;
				if (!marcat[v->first]) {
					coada.push(v->first);
					marcat[v->first] = true;
				}
			}
			v++;
		}
	}
}

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

	int i, x, y, z;
	scanf("%d %d", &nr_noduri, &nr_muchii);
	for (i = 0; i < nr_muchii; i++) {
		scanf("%d %d %d", &x, &y, &z);
		graf[x].push_back(make_pair(y, z));
	}

	drum_min();

	for (i = 2; i <= nr_noduri; i++)
		if (drum[i] < INT_MAX)
			printf("%d ", drum[i]);
		else
			printf("0 ");

	return 0;
}