Submission #1298835

#TimeUsernameProblemLanguageResultExecution timeMemory
1298835uranium235Robot (JOI21_ho_t4)C++17
100 / 100
674 ms97408 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

template <class a, class b> ostream& operator<<(ostream &l, const pair<a, b> &r) {
    l << "(" << r.first << ", " << r.second << ")";
    return l;
}

template <class t, unsigned long int s> ostream& operator<<(ostream &l, const array<t, s> &r) {
    l << "[";
    for (int i = 0; i + 1 < s; i++) l << r[i] << ", ";
    if (s > 0) l << r[s - 1];
    l << "]";
    return l;
}

template <class t> ostream& operator<<(ostream &l, const vector<t> &r) {
    l << "{";
    for (int i = 0; i + 1 < r.size(); i++) l << r[i] << ", ";
    if (!r.empty()) l << r.back();
    l << "}";
    return l;
}


struct token {
    int v, t, c;
    ll w;
};

bool operator>(const token &l, const token &r) {
    return l.w > r.w;
}

ostream& operator<<(ostream &l, const token &r) {
    l << r.v << " " << r.t << " " << r.c << " " << r.w;
    return l;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    int n, m;
    cin >> n >> m;
    vector<map<int, vector<pair<int, int>>>> adj(n);
    vector<map<int, ll>> tot(n);
    for (int i = 0; i < m; i++) {
        int a, b, c, w;
        cin >> a >> b >> c >> w;
        a--, b--;
        adj[a][c].push_back({b, w});
        adj[b][c].push_back({a, w});
        tot[a][c] += w;
        tot[b][c] += w;
    }

    vector<ll> dp(n, -1);
    vector<map<int, ll>> dp1(n);
    priority_queue<token, vector<token>, greater<token>> pq;
    pq.push({0, 0, 0, 0});

    while (!pq.empty()) {
        token x = pq.top();
        pq.pop();
        if (x.t) {
            if (dp1[x.v].find(x.c) != dp1[x.v].end()) continue;
            dp1[x.v][x.c] = x.w;
            ll total = tot[x.v][x.c];
            for (pair<int, int> &i : adj[x.v][x.c]) {
                pq.push({i.first, 0, x.c, x.w + total - i.second});
            }
        } else {
            if (dp[x.v] != -1) continue;
            dp[x.v] = x.w;
            
            for (auto& [k, v] : adj[x.v]) {
                for (pair<int, int> &i : v) {
                    ll val = min(ll(i.second), tot[x.v][k] - i.second);
                    pq.push({i.first, 0, -1, x.w + val});
                    pq.push({i.first, 1, k, x.w});
                }
            }
        }
    }

    cout << dp[n - 1] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...