Cod sursa(job #1252653)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 30 octombrie 2014 23:14:30
Problema Algoritmul lui Dijkstra Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.07 kb
#include <fstream>
#include <vector>
#include <set>
using namespace std;

ifstream is("1.in");
ofstream os("1.out");

#define INF 0x3f3f3f3f
#define pb push_back
vector<int> V;
vector<vector<pair<int, int> > > G;
vector<int> Cost;
set<pair<int, int> > Q;
int i, j, cost;
int Ok[100];
int n;

void Dijkstra(int k);
void Read();
void Write();

int main()
{
	Read();
	Dijkstra(1);
	Write();
	is.close();
	os.close();
	return 0;
}

void Read()
{
	is >> n;
	G.resize(n + 1);
	Cost.resize(n + 1, INF);
	while ( is >> i >> j >> cost )
		G[i].pb( {j, cost} );
}
void Dijkstra(int k)
{
	int t;
	Cost[k] = 0;
	Q.insert( {k, 0});
	while ( !Q.empty() )
	{
		i = Q.begin()->first;
		cost = Q.begin()->second;
		Q.erase(Q.begin());
		if ( Ok[i] )
			continue;
		Ok[i] = true;
		for ( const auto& y : G[i] )
		{
			j = y.first;
			t = y.second;
			if ( Cost[j] > cost + t )
			{
				Cost[j] = cost + t;
				Q.insert( {j, Cost[j]});
			}
		}
	}
}

void Write()
{
	for ( vector<int>::iterator it = Cost.begin() + 2; it != Cost.end(); ++it )
		if ( *it == INF )
			os << 0 << ' ';
		else
			os << *it << ' ';
}