Pagini recente » Cod sursa (job #428150) | Cod sursa (job #2314601) | Cod sursa (job #811123) | Cod sursa (job #2812489) | Cod sursa (job #2838163)
#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[14100];
int numarVarfuri, numarMuchii, x, y;
int a, b, nrDrumuri, d;
std::pair<int, int> parinti[14010];
int calculateLevels() // use breadth first search to calculate the levels
{
int visitate[14100];
std::fill(visitate + 0, visitate + 14100, -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;
}