Moo Route

#include <vector>
#include <iostream>
#include <limits.h>
#include <algorithm>

int main()
{
	int n, m;
	std::cin >> n >> m;
	std::vector<std::vector<std::pair<int, std::pair<int, int>>>> flights(n);
	std::vector <int> layoffs(n);
	std::vector<int> time(n);
	for (int i = 0; i < m; i++)
	{
		int a;
		std::cin >> a;
		a--;
		std::pair<int, std::pair<int, int>> temp;
		std::cin >> temp.first >> temp.second.first >> temp.second.second;
		temp.second.first--;
		flights[a].push_back(temp);
	}

	for (int i = 0; i < n; i++)
	{
		std::cin >> layoffs[i];
	}

	for (int i = 1; i < n; i++)
	{
		time[i] = INT_MAX;
	}

	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < flights[i].size(); j++)
		{
			flights[i][j].first -= layoffs[i];
		}
		std::sort(flights[i].begin(), flights[i].end(), std::greater<std::pair<int, std::pair<int, int>>>());
	}

	std::vector <std::pair<int, int>> queue;
	queue.push_back(std::make_pair(0, 0));
	int iterator = 0;

	while (iterator < queue.size())
	{
		int pos = queue[iterator].first;
		int curr_time = queue[iterator].second;
		int orig_time = time[pos];
		time[pos] = std::min(time[pos], curr_time);

		if (orig_time != time[pos] || iterator == 0)
		{
			for (int i = 0; i < flights[pos].size(); i++)
			{
				int check = flights[pos][i].first;
				if (iterator == 0)
				{
					check += layoffs[0];
				}
				if (curr_time <= check)
				{
					queue.push_back(flights[pos][i].second);
				}
				else
					break;
			}
		}
		iterator++;
	}

	for (auto t : time)
	{
		if (t == INT_MAX)
		{
			t = -1;
		}
		std::cout << t << std::endl;
	}
}

Last updated