#include <bits/stdc++.h>
using namespace std;
vector < pair <int , int> > adiacenta[100001];
int64_t distanta[3][100001] , minim[100001][2];
int ordine[100001];
inline void Dijkstra (const int numar_noduri , int nod , int64_t __distanta[])
{
for (int indice = 1 ; indice <= numar_noduri ; indice++)
{ __distanta[indice] = 10000000000000000LL; }
priority_queue < pair <int64_t , int> > candidati;
candidati.emplace(__distanta[nod] = 0 , nod);
while (!candidati.empty())
{
nod = candidati.top().second;
if (__distanta[nod] != -candidati.top().first)
{ candidati.pop(); continue; }
candidati.pop();
for (auto& vecin : adiacenta[nod]) {
if (__distanta[vecin.first] > __distanta[nod] + vecin.second)
{ candidati.emplace(-(__distanta[vecin.first] = __distanta[nod] + vecin.second) , vecin.first); }
}
}
}
int main ()
{
ios :: sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int numar_noduri , numar_muchii , inceput[2] , sfarsit[2];
cin >> numar_noduri >> numar_muchii >> inceput[0] >> sfarsit[0] >> inceput[1] >> sfarsit[1];
while (numar_muchii--)
{
int nod[2] , cost;
cin >> nod[0] >> nod[1] >> cost;
adiacenta[nod[0]].emplace_back(nod[1] , cost);
adiacenta[nod[1]].emplace_back(nod[0] , cost);
}
Dijkstra(numar_noduri , inceput[0] , distanta[0]);
Dijkstra(numar_noduri , inceput[1] , distanta[1]);
Dijkstra(numar_noduri , sfarsit[1] , distanta[2]);
for (int indice = 1 ; indice <= numar_noduri ; indice++)
{ ordine[indice] = indice; }
sort(ordine + 1 , ordine + numar_noduri + 1 , [] (int& optiune_1 , int& optiune_2) -> bool {
return distanta[0][optiune_1] > distanta[0][optiune_2];
});
int64_t rezultat = distanta[1][sfarsit[1]];
for (int indice = 1 ; indice <= numar_noduri ; indice++)
{
int& nod = ordine[indice];
if (nod == sfarsit[0]) {
minim[nod][0] = distanta[1][nod];
minim[nod][1] = distanta[2][nod];
} else {
minim[nod][0] = 10000000000000000LL;
minim[nod][1] = 10000000000000000LL;
}
for (auto& vecin : adiacenta[nod]) {
if (distanta[0][vecin.first] == distanta[0][nod] + vecin.second)
{
rezultat = min(rezultat , distanta[1][nod] + minim[vecin.first][1]);
rezultat = min(rezultat , distanta[2][nod] + minim[vecin.first][0]);
minim[nod][0] = min(minim[nod][0] , minim[vecin.first][0]);
minim[nod][1] = min(minim[nod][1] , minim[vecin.first][1]);
}
}
if (minim[nod][0] != 10000000000000000LL) {
minim[nod][0] = min(minim[nod][0] , distanta[1][nod]);
minim[nod][1] = min(minim[nod][1] , distanta[2][nod]);
}
}
cout << rezultat;
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |