Cod sursa(job #2607709)

Utilizator mirceamaierean41Mircea Maierean mirceamaierean41 Data 30 aprilie 2020 02:42:31
Problema Pitici Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

class InParser
{
#pragma warning(disable:4996)
private:
	FILE* fin;
	char* buff;
	int sp;
	char read()
	{
		++sp;
		if (sp == 4096)
		{
			sp = 0;
			fread(buff, 1, 4096, fin);
		}
		return buff[sp];
	}
public:
	InParser(const char* nume)
	{
		sp = 4095;
		buff = new char[4096];
		fin = fopen(nume, "r");
	}
	InParser& operator >> (short& n)
	{
		char c;
		while (!isdigit(c = read()));
		n = c - '0';
		while (isdigit(c = read()))
			n = n * 10 + c - '0';
		return *this;
	}
	InParser& operator >> (int& n)
	{
		char c;
		while (!isdigit(c = read()));
		n = c - '0';
		while (isdigit(c = read()))
			n = n * 10 + c - '0';
		return *this;
	}
};
InParser fin("pitici.in");
ofstream fout("pitici.out");

const int NMAX = 1020;

int n, m, k, c;
short x, y;

typedef pair <int, short> ps;

vector <ps> g[NMAX];

priority_queue <ps, vector <ps>, greater <ps> > q;

vector <int> pit;

void Dijkstra()
{
	q.push({ 0, 1 });
	while (!q.empty())
	{
		ps a = q.top();
		q.pop();
		if (a.second == n)
		{
			fout << a.first << " ";
			k--;
			if (k == 0)
				return;
		}
		for (size_t i = 0; i < g[a.second].size(); ++i)
		{
			y = g[a.second][i].second, c = g[a.second][i].first + a.first;
			q.push({ c, y });
		}
	}
}

int main()
{
	fin >> n >> m >> k;

	for (int i = 1; i <= n; ++i)
		g[i].reserve(n);
	

	for (int i = 1; i <= m; ++i)
	{
		fin >> x >> y >> c;
		g[x].push_back({ c, y });
	}

	Dijkstra();

	fout.close();
	return 0;
}