#include #include #include #include #include using std::pop_heap; using std::push_heap; using std::min; using std::max; using std::vector; using std::pair; const long long LLMAX = std::numeric_limits::max(); struct Nd { vector> e; // Sousedi vrcholu a vzdálenosti k nim long long lenFrom[3]; // vzdálenosti k prvním třem vrcholům }; Nd * nd; // Vrcholy na rozdíl od zadání interně indexujeme od 0 int n,m; void calcLen(int from) { // Spočte vzdálenost každého vrcholu od vrcholu s indexem `from` // Funkce provede Dijkstrův algoritmus for (int i=0;i; // Typ prvku prioritní fronty (haldy) auto cmp = [](T a, T b)->bool{return a.first > b.first;}; T * todo = new T[2*m+1]; // Prioritní fronta implementovaná haldou todo[0] = {0, nd+from}; int todoLen = 1; while (todoLen) { auto act = todo[0]; pop_heap(todo, todo + todoLen--, cmp); if (act.second->lenFrom[from]==LLMAX) { act.second->lenFrom[from]=act.first; for (auto e : act.second->e) { todo[todoLen++] = {e.second+act.first, e.first}; push_heap(todo, todo+todoLen, cmp); } } } delete [] todo; } int main() { long long onePersonKmToKc, twoPeopleKmToKc; scanf("%d%d%lld%lld", &n, &m, &onePersonKmToKc, &twoPeopleKmToKc); nd = new Nd[n]; assert(n>=3); for (int i=0; i