Cod sursa(job #2097304)

Utilizator alinp25Alin Pisica alinp25 Data 30 decembrie 2017 21:45:27
Problema Algoritmul lui Dijkstra Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
#include <vector>
#include <queue>
#include <iostream>

#define inf 0x3f3f3f3f
#define NMax 50005

using namespace std;

int n, m;

bool inQueue[NMax];
std::vector < int > d(NMax, inf);
std::vector<std::pair<int, int> > v[NMax];

struct comparison {
	bool operator() (int x, int y) {
		return d[x] > d[y];
	}
};

std::priority_queue<int, std::vector<int>, comparison> q;

void read() {
	std::ifstream fin("dijkstra.in");
	fin >> n >> m;
	int x, y, w;
	for (int i = 0; i < m; i++) {
		fin >> x >> y >> w;
		v[x].push_back(make_pair(y, w));
	}
	fin.close();
}

void solveDijkstra(int node) {
	d[node] = 0;
	q.push(node);
	inQueue[node] = true;

	while (!q.empty()) {
		int current = q.top();
		q.pop();
		inQueue[current] = true;
		for (int i = 0; i < v[current].size(); i++) {
			int next = v[current][i].first;
			int cost = v[current][i].second;
			if (d[current] + cost < d[next]) {
				d[next] = d[current] + cost;
				if (inQueue[next] == false) {
					q.push(next);
					inQueue[next] == true;
				}
			}
		}
	}
}

void print() {
	std::ofstream fout("dijkstra.out");
	for (int i = 2; i <= n; i++) {
		if (d[i] != inf) {
			fout << d[i] << " ";
		} else {
			fout << "0 ";
		}
	}
	fout.close();
}

int main(int argc, char *argv[]) {
	read();
	solveDijkstra(1);
	print();
	return 0;
}