Submission #1126061

#TimeUsernameProblemLanguageResultExecution timeMemory
1126061codexistentRobot (JOI21_ho_t4)C++20
100 / 100
238 ms15244 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define MAXN 100005
#define MAXM 200005
#define FOR(i, a, b) for(ll i = a; i <= b; i++)
#define f first
#define s second

vector<array<int, 3>> g[MAXN];
ll di[MAXN], S[MAXM], mn[MAXM];
bool vis[MAXN];
int main() {
    int n, m;
    cin >> n >> m;
    for (int i = 0; i < m; ++i) {
        int u, v, w, c;
        cin >> u >> v >> c >> w;
        g[u].push_back({v, w, c});
        g[v].push_back({u, w, c});
    }
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
    fill(di, di+n+1, 1e18);
    di[1] = 0;
    pq.push({0, 1});
    while (!pq.empty()) {
        ll D = pq.top().f;
        ll s = pq.top().s;
        pq.pop();
        if (vis[s]) continue;
        vis[s] = 1;
        for (auto i : g[s]) mn[i[2]] = 1e18, S[i[2]] = 0;
        for (auto i : g[s]) S[i[2]] += i[1];
        for (auto i : g[s]) mn[i[2]] = min(mn[i[2]], di[i[0]] + S[i[2]]);
        for (auto i : g[s]) {
            if (di[i[0]] > min({di[s] + i[1], di[s] + S[i[2]] - i[1], mn[i[2]] - i[1]})) {
                di[i[0]] = min({di[s] + i[1], di[s] + S[i[2]] - i[1], mn[i[2]] - i[1]});
                pq.push({di[i[0]], i[0]});
            }
        }
    }
    cout << (di[n] > 1e15 ? -1 : di[n]) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...