Submission #1158047

#TimeUsernameProblemLanguageResultExecution timeMemory
1158047vladiliusRobot (JOI21_ho_t4)C++20
0 / 100
3096 ms67540 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define arr3 array<int, 3>
#define arr4 array<ll, 4>

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    int n, m; cin>>n>>m;
    vector<arr3> g[n + 1];
    vector<map<int, int>> mp(n + 1);
    while (m--){
        int x, y, c, w; cin>>x>>y>>c>>w;
        g[x].pb({y, c, w});
        g[y].pb({x, c, w});
        mp[x][c]++; mp[y][c]++;
    }
    
    queue<arr4> q; q.push({1, 0, 0, 0});
    vector<map<pair<int, bool>, ll>> dist(n + 1);
    dist[1][{0, 0}] = 0;
    while (!q.empty()){
        auto [v, k, P, ds] = q.front(); q.pop();
        if (ds != dist[v][{P, k > 0}]) continue;
        for (auto [u, c, w]: g[v]){
            int cc = mp[v][c] - (c == k);
            
            ll f = ds + w;
            if (dist[u].find({v, 1}) == dist[u].end()){
                dist[u][{v, 1}] = f;
                q.push({u, c, v, f});
            }
            else if (f < dist[u][{v, 1}]){
                dist[u][{v, 1}] = f;
                q.push({u, c, v, f});
            }
            
            if (u == P && k){
                assert(c == k);
                if (dist[u].find({v, 1}) == dist[u].end()){
                    dist[u][{v, 1}] = ds;
                    q.push({u, k, v, ds});
                }
                else if (ds < dist[u][{v, 1}]){
                    dist[u][{v, 1}] = ds;
                    q.push({u, k, v, ds});
                }
            }
            
            if (cc <= 1){
                ll f = ds;
                if (dist[u].find({v, 0}) == dist[u].end()){
                    dist[u][{v, 0}] = f;
                    q.push({u, 0, v, f});
                }
                else if (f < dist[u][{v, 0}]){
                    dist[u][{v, 0}] = f;
                    q.push({u, 0, v, f});
                }
            }
        }
    }
    
    if (dist[n].empty()){
        cout<<-1<<"\n";
    }
    else {
        ll out = 1e18;
        for (auto [x, y]: dist[n]) out = min(out, y);
        cout<<out<<"\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...