Cod sursa(job #1826786)

Utilizator msciSergiu Marin msci Data 10 decembrie 2016 21:10:12
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>

using namespace std;

const int INF = 0x3f3f3f3f;
const int NMAX = 50005;

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

void dijkstra(int source) {
	dist[source] = 0;
	priority_queue<pair<int, int> > q;
	q.push({source, 0});
	while (!q.empty()) {
		pair<int, int> node = q.top();
		q.pop();
		int u = node.first;
		int d = node.second;
		if (d != dist[u]) continue;
		for (int i = 0; i < adj[u].size(); i++) {
			int v = adj[u][i].first;
			int weight = adj[u][i].second;
			int newDist = dist[u] + weight;
			if (dist[v] > newDist) {
				dist[v] = newDist;
				q.push({v, newDist});
			}
		}
	}
}

void dijkstra2(int source) {
	dist[source] = 0;
	set<pair<int, int> > q;
	q.insert({source, 0});
	while (!q.empty()) {
		pair<int, int> node = *q.begin();
		q.erase(q.begin());
		int u = node.first;
		int d = node.second;
		if (d != dist[u]) continue;
		for (int i = 0; i < adj[u].size(); i++) {
			int v = adj[u][i].first;
			int weight = adj[u][i].second;
			int newDist = dist[u] + weight;
			if (dist[v] > newDist) {
				dist[v] = newDist;
				q.insert({v, newDist});
			}
		}
	}
}

int main() {
	freopen("dijkstra.in", "r", stdin);
	freopen("dijkstra.out", "w", stdout);
	scanf("%d %d", &N, &M);
	memset(dist, INF, sizeof(dist));
	for (int i = 0; i < M; i++) {
		int x, y, w;
		scanf("%d %d %d", &x, &y, &w);
		adj[x].push_back({y, w});
	}
	dijkstra2(1);
	for (int i = 2; i <= N; i++) {
		if (dist[i] == INF) printf("0 ");
		else printf("%d ", dist[i]);
	}
	printf("\n");
}