Cod sursa(job #2838168)

Utilizator AsandeiStefanAsandei Stefan-Alexandru AsandeiStefan Data 23 ianuarie 2022 10:58:13
Problema Sate Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <fstream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>

std::ifstream fin("sate.in");
std::ofstream fout("sate.out");

std::vector<std::pair<int, int>> graf[141000];
int numarVarfuri, numarMuchii, x, y;
int a, b, nrDrumuri, d;
std::pair<int, int> parinti[140100];

int calculateLevels() // use breadth first search to calculate the levels
{
	int visitate[141000];
	std::fill(visitate + 0, visitate + 141000, -1);

	std::queue<int> noduriCeTrebuieProcesate;
	noduriCeTrebuieProcesate.push(x);

	visitate[x] = 0;

	while (noduriCeTrebuieProcesate.size() > 0)
	{
		int currentNode = noduriCeTrebuieProcesate.front();

		for (unsigned int i = 0; i < graf[currentNode].size(); i++)
		{
			int nod = graf[currentNode][i].first;

			if (visitate[nod] == -1) // daca nu gasim nodul curent in nivel
			{
				visitate[nod] = visitate[currentNode] + 1;
				parinti[nod] = { currentNode, graf[currentNode][i].second };
				noduriCeTrebuieProcesate.push(nod);
			}

			if (nod == y)
				return visitate[y];
		}

		noduriCeTrebuieProcesate.pop();
	}

	return visitate[y];
}

int main()
{
	fin >> numarVarfuri >> numarMuchii >> x >> y;
	for (int i = 0; i < numarMuchii; i++)
	{
		fin >> a >> b >> d;
		graf[a].push_back({ b, d });
		graf[b].push_back({ a, d });
	}

	int nivelY = calculateLevels(), sum=0;
	std::pair<int, int> nod = {y, 0};

	while (nod.first != x)
	{
		if (nod.first > parinti[nod.first].first)
			sum += parinti[nod.first].second;
		else 
			sum -= parinti[nod.first].second;

		nod = parinti[nod.first];
	}

	fout << sum << '\n';

	return 0;
}