Cod sursa(job #2434893)

Utilizator ShayTeodor Matei Shay Data 2 iulie 2019 15:30:51
Problema Algoritmul lui Dijkstra Scor 10
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include<bits/stdc++.h>

#define INF 0x3f3f3f3f

typedef std::pair<int, int> int_pair;

inline void print(int n) {
	char snum[65];
	int i = 0;
	do {
		snum[i++] = n % 10 + '0';
		n /= 10;
	} while (n);

	--i;

	while (i >= 0) {
		putchar(snum[i--]);
	}

	putchar(' ');
}

inline int read() {
	int n = 0;
	char c = getchar_unlocked();

	while (!('0' <= c && c <= '9')) {
		c = getchar_unlocked();
	}

	while ('0' <= c && c <= '9') {
		n = (n << 3) + (n << 1) + c - '0';
		c = getchar_unlocked();
	}

	return n;
}

class Graph {
private:
	int nr_nodes;
	std::vector<std::pair<int, int>> *adj;
public:
	Graph(int nr_nodes) {
		this->nr_nodes = nr_nodes;
		adj = new std::vector<int_pair> [nr_nodes];
	}

	~Graph() {
		delete [] adj;
	}

	void addEdge(int src, int dest, int cost) {
		adj[src].push_back(std::make_pair(dest, cost));
		adj[dest].push_back(std::make_pair(src, cost));
	}

	void dijkstra(int src) {
		std::priority_queue <int_pair, std::vector<int_pair>,
			std::greater<int_pair>> pq;

		std::vector<int> dist(nr_nodes, INF);
		std::vector<bool> visited(nr_nodes, false);
		pq.push(std::make_pair(0, src));
		dist[src] = 0;
		while (!pq.empty()) {
			int node_src = pq.top().second;
			pq.pop();
		
			if (!visited[node_src]) {
				for (auto it : adj[node_src]) {
					int node_dest = it.first;
					int w = it.second;

					if (dist[node_dest] > dist[node_src] + w) {
						dist[node_dest] = dist[node_src] + w;
						pq.push(std::make_pair(dist[node_dest], node_dest));
					}
				
				}

				visited[node_src] = true;
			}
		}

		for (int i = 1 ; i < nr_nodes ; ++i) {
			print(dist[i]);
		}
	}
};


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

	int n, m, src, dest, cost;

	n = read();
	m = read();
	Graph graph(n);
	for (; m ; --m) {
		src = read(), dest = read(), cost = read();
		graph.addEdge(src - 1, dest - 1, cost);
	}

	graph.dijkstra(0);
	return 0;
}