Cod sursa(job #3201993)

Utilizator robeteaRobert Cristea robetea Data 10 februarie 2024 12:06:52
Problema Algoritmul lui Dijkstra Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
/*#include <bits/stdc++.h>
#include <fstream>

struct nod {
	std::vector<int> vecini; 
	bool vizitat;
};
std::vector<nod> noduri;

void dfs(int nod_curent) {
	std::cout << nod_curent + 1 << ' ';

	noduri[nod_curent].vizitat = true;

	std::sort(noduri[nod_curent].vecini.begin(), noduri[nod_curent].vecini.end());
	//for(int i = 0; i < noduri[nod_curent].vecini.size(); i++)
	for(int index_vecin : noduri[nod_curent].vecini) {
		if(noduri[index_vecin].vizitat == false)
			dfs(index_vecin);
	}
}

int main() {
	//std::ifstream fin("dfs.in");
	freopen("dfs.in", "r", stdin);
	freopen("dfs.out", "w", stdout);

	int n, m; std::cin >> n >> m;
	int start; std::cin >> start;
	noduri.resize(n);

	for(int i = 0; i < m; i++) {
		int a, b;
		std::cin >> a >> b;
		a--; b--;
		noduri[a].vecini.push_back(b);
		noduri[b].vecini.push_back(a);

	}

	dfs(start - 1);
	return 0;
}
*/

#include <bits/stdc++.h>
#include <queue>

const int LIM = 1e5+5;
std::vector<std::pair<int, int>> vecini[LIM];
long long dist[LIM];

struct nod {
	long long dist; 
	int index;

	bool operator<(const nod& other) const {
		// calculezi raspunsul
		return dist < other.dist;
	}
};


void bfs(int start) {
	for(int i = 0; i < LIM; i++)
		dist[i] = 2e9;

	std::priority_queue<nod> q;

	q.push({0, start});
	dist[start] = 0;

	while(!q.empty()) {
		int curent = q.top().index;
		long long parcurs = q.top().dist;
		q.pop();
		if(dist[curent] < parcurs) continue;

		for(auto v : vecini[curent]) {
			if(dist[v.first] <= parcurs + v.second) continue;

			dist[v.first] = parcurs + v.second;
			q.push({dist[v.first], v.first});
		}
	}
}

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

	int n, m, start = 1; std::cin >> n >> m;
	while(m--) {
		int a, b, c; std::cin >> a >> b >> c;
		a--; b--;
		vecini[a].push_back({b, c});
	}

	bfs(start - 1);
	for(int i = 1; i < n; i++)
	{
		if(dist[i] == 2e9)
			std::cout << "0 ";
		else
			std::cout << dist[i] << ' ';
	}
    return 0;
}