Cod sursa(job #1820312)

Utilizator TudorVersoiuVersoiu Tudor Sorin TudorVersoiu Data 1 decembrie 2016 16:12:13
Problema Algoritmul lui Dijkstra Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cstring>
#include <limits>
#include <vector>
#include <set>

#define BYTE_INF std::numeric_limits<char>::max() 
#define INF 	 std::numeric_limits<int >::max()
#define MAXN 	 50005
#define MAXM 	 50005
#define START 	 1

std::ifstream f("dijkstra.in" );
std::ofstream g("dijkstra.out");

unsigned int MinDist[MAXN], N, M;

std::vector< std::pair<int, int> > Adiacenta[MAXN];
std::set   < std::pair<int, int> > partial;

int main()
{
	f >> N >> M;

	for ( int i=1, x, y, z; i<=M; i++)
	{
		f >> x >> y >> z;
		Adiacenta[x].push_back( std::make_pair(y, z) );
	}

	memset(MinDist, BYTE_INF, sizeof(MinDist));
	MinDist[START] = 0;
	partial.insert( std::make_pair(0, 1) );

	while ( !partial.empty() )
	{
		int distance = partial.begin()->first;
		int node     = partial.begin()->second;
		partial.erase( partial.begin());

		for ( std::vector< std::pair<int, int> >::iterator it = Adiacenta[node].begin(); it!=Adiacenta[node].end(); ++it )
		{
			int target  = it->first;
			int segment = it->second;

			if ( distance + segment < MinDist[target] )
			{
				if ( MinDist[target] != INF )
					partial.erase( std::make_pair(MinDist[target], target) );

				MinDist[target] = distance + segment;
				partial.insert( std::make_pair(MinDist[target], target) );
			}
		}
	}

	for ( int i=2; i<=N; i++ )
		g << (MinDist[i]==INF?0:MinDist[i]) << ' ';
}