Cod sursa(job #1972953)

Utilizator cuvacalapecoLilian Grindea cuvacalapeco Data 24 aprilie 2017 00:16:55
Problema Algoritmul lui Dijkstra Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <iostream>
#include <fstream>
#include <map>
#include <vector>
#include <queue>
#include <cstring>
#include <bitset>

using namespace std;


struct Order
{
	bool operator()( const pair< int, int > &firstElem, const pair< int, int > &secondElem )
	{
		return firstElem.second > secondElem.second;
	}
};

int main()
{
	// N noduri M arce
	int N, M;
	vector< vector< pair< int, int > > > g(50001);
	priority_queue< pair< int, int >, vector< pair <int, int > >, Order > Q;
	bitset<50001> visited;
	unsigned int dist[50001]; // distanta minima de la nodu 1 la nodul i
	int A, B, C;

	memset( dist, 0xFF, sizeof( dist ) );

	ifstream fin( "dijkstra.in" );
	fin >> N >> M;

	for (int i = 0; i < M; ++i)
	{		
		fin >> A >> B >> C;
		
		g[A].push_back( { B, C } );
	}
	fin.close();

	int u, best_cost;

	Q.push( { 1, 0 } );
	dist[1] = 0; //dist de la sursa la sursa

	while (!Q.empty())
	{
		u = Q.top().first;
		best_cost = Q.top().second;
		Q.pop();

		if (visited.test(u))
			continue;

		visited.set( u );

		for (unsigned int i = 0; i < g[u].size(); ++i)
		{
			B = g[u][i].first;
			C = g[u][i].second;

			if (dist[B] > best_cost + C )
			{
				dist[B] = best_cost + C;
				Q.push( { B, dist[B] } );
			}

		}

		
	}

	ofstream fout( "dijkstra.out" );
	for (int i = 2; i <= N; ++i)
	{
		if (dist[i] == 4294967295)
			dist[i] = 0;
		fout << dist[i] << " ";
	}
	fout.close();
	
    return 0;
}