Submission #1272617

#TimeUsernameProblemLanguageResultExecution timeMemory
1272617witek_cppRobot (JOI21_ho_t4)C++20
34 / 100
3111 ms591376 KiB
#include <iostream> #include <vector> #include <algorithm> #include <unordered_map> #include <queue> using namespace std; typedef long long ll; #define st first #define nd second #define f(a, c, b) for (int a = c; b > a; a++) #define pb push_back #define all(a) a.begin(), a.end() #define sz(a) int(a.size()) vector<vector<int>> g; //bedzie zawierac ind krawedzi vector<unordered_map<int, int>> ile; //ile wchodzi danego rodzaju do wierzcholka vector<unordered_map<int, ll>> suma; vector<pair<pair<int, int>, pair<int, ll>>> e; //krawedzie pair<int, pair<int, ll>> kr(int v, int ind) { if (e[ind].st.st == v) return {e[ind].st.nd, {e[ind].nd.st, e[ind].nd.nd}}; return {e[ind].st.st, e[ind].nd}; } ll wnk = 213769420696969; int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n >> m; g.resize(n + 1); e.resize(m + 1); ile.resize(n + 1); suma.resize(n + 1); f(i, 1, m + 1) { int a, b, c; ll p; cin >> a >> b >> c >> p; ile[a][c]++; ile[b][c]++; suma[a][c] += p; suma[b][c] += p; g[a].pb(i); g[b].pb(i); e[i] = {{a, b}, {c, p}}; } const ll DUZO = 1000000; priority_queue<pair<ll, ll>> kolejka; //koszt - zahaszowany wierzcholek kolejka.push({0, 1}); unordered_map<ll, ll> ans; //odpowiedzi while (!kolejka.empty()) { ll koszt = -kolejka.top().st; if (ans.find(kolejka.top().nd) != ans.end()) {kolejka.pop(); continue;} ans[kolejka.top().nd] = koszt; int v = kolejka.top().nd%(DUZO); int ind = kolejka.top().nd/DUZO; //cout << "int v to " << v << " ind to " << ind << " koszt to " << koszt << "\n"; kolejka.pop(); if (v == n) { cout << koszt; return 0; } int kolor = -1; if (ind != 0) { kolor = kr(v, ind).nd.st; ile[v][kolor]--; suma[v][kolor] -= kr(v, ind).nd.nd; } //cout << "a"; for (int ele: g[v]) { //cout << ele << " "; pair<int, pair<int, ll>> u = kr(v, ele); if (ile[v][u.nd.st] == 1) { if (ans.find(u.st) == ans.end()) { kolejka.push({-koszt, u.st}); } } else { ll pot = u.st + ll(ele) * DUZO; if (ans.find(pot) == ans.end()) { kolejka.push({-(koszt + u.nd.nd), pot}); } if (u.nd.nd > (suma[v][u.nd.st] - u.nd.nd)) { if (ans.find(u.st) == ans.end()) kolejka.push({-(koszt + (suma[v][u.nd.st] - u.nd.nd)), u.st}); } } } if (kolor != -1) {ile[v][kolor]++; suma[v][kolor] += kr(v, ind).nd.nd;} //cout << "\n"; } if (wnk == 213769420696969) { cout << -1; } else { cout << wnk; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...