Submission #1115059

#TimeUsernameProblemLanguageResultExecution timeMemory
1115059staszic_ojuzOlympic Bus (JOI20_ho_t4)C++17
0 / 100
1055 ms3524 KiB
#include <iostream> #include <vector> #include <queue> using namespace std; const int MAXN = 201; int n, m; vector<pair<int, pair<int, int>>> sasiedzi[MAXN][2]; vector<pair<pair<int, int>, pair<int, int>>> krawedzie; int dijkstra_odwrocona_pomocnik[MAXN]; bool odwiedzona[MAXN]; int dijkstra_odwrocona(int od_, int do_, int u, int v, int cost, int rodzaj_grafu) { for (int i = 0; MAXN > i; i++) { odwiedzona[i] = false; dijkstra_odwrocona_pomocnik[i] = 1010000000; } priority_queue<pair<int, int>> kolejka; //koszt wierzcholek kolejka.push({0, od_}); pair<int, int> p1; int aktl_v; int aktl_koszt; while (!kolejka.empty()) { p1 = kolejka.top(); aktl_v = p1.second; aktl_koszt = -p1.first; kolejka.pop(); if (odwiedzona[aktl_v]) continue; odwiedzona[aktl_v] = true; dijkstra_odwrocona_pomocnik[aktl_v] = aktl_koszt; if (aktl_v == v) { if (!odwiedzona[u]) { kolejka.push({-(aktl_koszt + cost), u}); } } for (pair<int, pair<int, int>> ele: sasiedzi[aktl_v][rodzaj_grafu]) { if (aktl_v != u) { if (odwiedzona[ele.first]) continue; kolejka.push({-(aktl_koszt + ele.second.first), ele.first}); } else { if (ele.first != v) { if (odwiedzona[ele.first]) continue; kolejka.push({-(aktl_koszt + ele.second.first), ele.first}); } } } } return dijkstra_odwrocona_pomocnik[do_]; } int p; int zrob(int v, int u, int cost, int d) { int wynik = d; //cout << "d " << d << "\n"; wynik += dijkstra_odwrocona(1, n, v, u, cost, 0); //cout << "z " << 1 << " do " << n << " " << wynik - d<< "\n"; p = dijkstra_odwrocona(n, 1, v, u, cost, 0); wynik += p; //cout << "z " << n << " do " << 1 << " " << p << "\n"; return wynik; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; int w1, w2, w3, w4; for (int i = 0; m > i; i++) { cin >> w1 >> w2 >> w3 >> w4; krawedzie.push_back({{w1, w2}, {w3, w4}}); sasiedzi[w1][0].push_back({w2, {w3, w4}}); sasiedzi[w2][1].push_back({w1, {w3, w4}}); } int wynik = 1010000000; wynik = zrob(-1, -1, 0, 0); for (auto ele: krawedzie) { wynik = min(wynik, zrob(ele.first.first, ele.first.second, ele.second.first, ele.second.second)); } if (wynik >= 1010000000) { wynik = -1; } cout << wynik << "\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...