Submission #1229995

#TimeUsernameProblemLanguageResultExecution timeMemory
1229995phtungRobot (JOI21_ho_t4)C++20
34 / 100
102 ms40176 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long


const int maxn = 1e5 + 5;
const int INF = 1e18;

struct EdgeInfo {
    int c, v, p;
};

vector<EdgeInfo> adj[maxn];
vector<pair<int, int>> g[maxn];
int dist[maxn];
bool visited[maxn];

void dijkstra(int total) {
    fill(dist, dist + total + 1, INF);
    dist[1] = 0;

    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    pq.push({0, 1});

    while (!pq.empty()) {
        auto [du, u] = pq.top(); pq.pop();
        if (visited[u]) continue;
        visited[u] = true;

        for (auto [v, w] : g[u]) {
            if (dist[u] + w < dist[v]) {
                dist[v] = dist[u] + w;
                if (!visited[v])
                    pq.push({dist[v], v});
            }
        }
    }
}

void solve() {
    int n, m;
    cin >> n >> m;

    int total = n;

    for (int i = 0; i < m; ++i) {
        int u, v, c, p;
        cin >> u >> v >> c >> p;
        adj[u].push_back({c, v, p});
        adj[v].push_back({c, u, p});
        g[u].push_back({v, p});
        g[v].push_back({u, p});
    }

    for (int u = 1; u <= n; ++u) {
        sort(adj[u].begin(), adj[u].end(), [](const EdgeInfo &a, const EdgeInfo &b) {
            return a.c < b.c;
        });

        int l = 0;
        for (int r = 1; r < adj[u].size(); ++r) {
            if (adj[u][r].c != adj[u][l].c) {
                if (r - l == 1) {
                    g[u].push_back({adj[u][l].v, 0});
                } else {
                    int sum = 0;
                    for (int k = l; k < r; ++k)
                        sum += adj[u][k].p;
                    ++total;
                    g[u].push_back({total, 0});
                    for (int k = l; k < r; ++k) {
                        int v = adj[u][k].v;
                        int p = adj[u][k].p;
                        g[v].push_back({total, 0});
                        g[total].push_back({v, sum - p});
                    }
                }
                l = r;
            }
        }

        int r = adj[u].size();
        if (r - l == 1) {
            g[u].push_back({adj[u][l].v, 0});
        } else {
            int sum = 0;
            for (int k = l; k < r; ++k)
                sum += adj[u][k].p;
            ++total;
            g[u].push_back({total, 0});
            for (int k = l; k < r; ++k) {
                int v = adj[u][k].v;
                int p = adj[u][k].p;
                g[v].push_back({total, 0});
                g[total].push_back({v, sum - p});
            }
        }
    }

    dijkstra(total);

    if (dist[n] < INF / 2) cout << dist[n] << '\n';
    else cout << -1 << '\n';
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    solve();
    return 0; 
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...