Cod sursa(job #1541046)

Utilizator valiro21Valentin Rosca valiro21 Data 3 decembrie 2015 18:06:54
Problema Algoritmul lui Dijkstra Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <iostream>
#include <cstdio>
#include <list>
#include <vector>
#include <set>

#define Inf ((1<<30)-1)

using namespace std;

struct Graph {
	vector<list<pair<unsigned int, int> > > v;
};

Graph* readOrientedGraph() {
	int n, m;
	cin >> n >> m;

	Graph *G = new Graph();
	G->v.assign(n+1, *new list<pair<unsigned int, int> >());

	unsigned int x, y;
	int z;
	for (int i = 0; i < m; i++) {
		cin >> x >> y >> z;
		G->v[x].push_back(make_pair(y, z));
	}

	return G;
}

Graph* readGraph() {
	int n, m;
	cin >> n >> m;

	Graph *G = new Graph();
	G->v.assign(n + 1, *new list<pair<unsigned int, int> >());

	unsigned int x, y;
	int z;
	for (int i = 0; i < m; i++) {
		cin >> x >> y >> z;
		G->v[x].push_back(make_pair(y, z));
		G->v[y].push_back(make_pair(x, z));
	}

	return G;
}

int *d;

void dijkstra(Graph *G, unsigned int startNode) {
	set<pair<int, unsigned int> > st;
	d = new int[G->v.size () + 1];
	for (unsigned int i = 1; i <= G->v.size(); i++)
		d[i] = Inf;
	d[startNode] = 0;

	st.insert(make_pair (0, startNode));
	while (!st.empty()) {
		unsigned int node = st.begin()->second;

		for (list<pair<unsigned int, int> >::iterator it = G->v[node].begin (); it != G->v[node].end (); it++)
			if (d[node] + it->second < d[it->first]) {
				d[it->first] = d[node] + it->second;

				//push
				st.insert(make_pair (d[it->first], it->first));
			}

		//pop
		st.erase(st.begin());
	}
}

int main() {
	freopen("dijkstra.in", "rt", stdin);
	freopen("dijkstra.out", "wt", stdout);

	unsigned int startingNode = 1;
	Graph *G = readOrientedGraph();

	dijkstra(G, startingNode);
	for (unsigned int i = 1; i <= G->v.size () - 1; i++)
		if (i != startingNode)
			cout << (Inf != d[i] ? d[i] : 0) << ' ';

	return 0;
}