Cod sursa(job #2856944)

Utilizator Radu_TudorRadu Tudor Radu_Tudor Data 24 februarie 2022 17:15:17
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.5 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>

#define	INF 0x3F3F3F3F

using namespace std;

ifstream fin("date.in");
ofstream fout("date.out");

const int N_MAX = 5e4 + 1;

int n, m;

int dist[N_MAX];
bool in_queue[N_MAX];

struct compare {

	bool operator () (int x, int y) {

		return dist[x] > dist[y];
	}
};

priority_queue<int, vector<int>, compare> P;
vector<pair<int, int> > edge[N_MAX];

void read() {

	fin >> n >> m;

	int x, y, cost;
	for (int i = 1; i <= m; i++)
		fin >> x >> y >> cost,
		edge[x].push_back(make_pair(y, cost)),
		edge[y].push_back(make_pair(x, cost));
}

void init() {

	for (int i = 1; i <= n; i++)
		dist[i] = INF;
}

void dijkstra(int node) {

	dist[node] = 0;

	P.push(node);
	in_queue[node] = true;

	while (!P.empty()) {

		int current_node = P.top();

		P.pop();
		in_queue[current_node] = false;

		for (size_t i = 0; i < edge[current_node].size(); i++) {

			int neighbour = edge[current_node][i].first;
			int cost = edge[current_node][i].second;

			if (dist[neighbour] > dist[current_node] + cost) {
				dist[neighbour] = dist[current_node] + cost;

				if (in_queue[neighbour] == false)
					P.push(neighbour),
					in_queue[neighbour] = true;
			}
		}
	}
}

void solve() {

	init();
	dijkstra(1);
}

void display() {

	for (int i = 2; i <= n; i++)
		fout << dist[i] << " ";
}

int main() 
{
	read();
	solve();
	display();

	fin.close();
	fout.close();

	return 0;
}