Cod sursa(job #3253366)

Utilizator radu1331Mocan Radu radu1331 Data 2 noiembrie 2024 13:29:35
Problema Algoritmul lui Dijkstra Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1 kb
#include <iostream>
#include <queue>
#include <climits>
#include <vector>
#include <algorithm>
using namespace std;

bool vis[50005];
int d[50005], n;
vector<pair<int, int>> adj[50005];
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Q;

int findMin()
{
	while(vis[Q.top().second]) Q.pop();
	int nod = Q.top().second;
	vis[nod] = 1;
	Q.pop();
	return nod;
}

void dijkstra(pair<int, int> nod)
{
	Q.push(nod);	

	while(!Q.empty())	
	{
		int min = findMin();

		for(auto it : adj[min])
		{
			if(d[it.second] > d[min] + it.first)
				d[it.second] = d[min] + it.first,
				Q.push({d[it.second], it.second});	
		}
	}
}

int main()
{
  	(void)! freopen("dijkstra.in", "r", stdin);
  	(void)! freopen("dijkstra.out", "w", stdout);
	int m, x, y, z; cin >> n >> m;
	while(m--)
	{
		cin >> x >> y >> z;
		adj[x].push_back({z, y});
	}
	for(int i = 2; i <= n; ++i)
		d[i] = INT_MAX;
	dijkstra({0, 1});
	for(int i = 2; i <= n; ++i)
	{
		if(d[i] == INT_MAX) d[i] = 0;
		cout << d[i] << ' ';
	}
	return 0;
}