Submission #1329726

#TimeUsernameProblemLanguageResultExecution timeMemory
1329726nguyenkhangninh99Robot (JOI21_ho_t4)C++20
100 / 100
217 ms58244 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
const int maxn = 3e5 + 5, inf = 1e18;
vector<array<int, 3>> adj[maxn];
vector<pair<int, int>> g[maxn];
int dist[maxn];

void solve(){
    int n, m; cin >> n >> m;
    for(int i = 1; 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});
    }

    int sz = n;
    for(int t = 1; t <= n; t++){
        sort(adj[t].begin(), adj[t].end()); //sort theo color
        for(int i = 0; i < adj[t].size(); i++){
            int j = i;
            while(j + 1 < adj[t].size() && adj[t][i][0] == adj[t][j + 1][0]) j++;
            int len = j - i + 1;
            int u = t;
            if(len == 1) g[u].push_back({adj[t][i][1], 0});
            else {
                int cur = ++sz;
                g[u].push_back({cur, 0});
                int sump = 0;
                for(int k = i; k <= j; k++) sump += adj[t][k][2];
                for(int k = i; k <= j; k++){
                    int v = adj[t][k][1], p = adj[t][k][2];
                    g[u].push_back({v, p});
                    g[v].push_back({cur, 0});
                    g[cur].push_back({v, sump - p});
                }
            }
            i = j;
        }
    }
    for(int i = 2; i <= sz; i++) dist[i] = inf;
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
    pq.push({0, 1});
    while(pq.size()){
        auto [d, u] = pq.top();
        pq.pop();
        if(dist[u] < d) continue;
        for(auto [v, w]: g[u]){
            if(dist[v] > dist[u] + w){
                dist[v] = dist[u] + w;
                pq.push({dist[v], v});
            }
        }
    }
    cout << (dist[n] == inf ? -1 : dist[n]);
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...