Submission #1325842

#TimeUsernameProblemLanguageResultExecution timeMemory
1325842ivan_alexeevOlympic Bus (JOI20_ho_t4)C++20
5 / 100
1092 ms3412 KiB
#include <bits/stdc++.h>

using namespace std;

#ifndef lisie_bimbi
#define endl '\n'
#pragma GCC optimize("O3")
#pragma GCC target("avx,avx2,bmi2,fma")
#endif

using ll = long long;
const ll inf = 1'000'000'000'000'000'000;

#define int long long

int n;
vector<vector<pair<int, int>>> v;

vector<int> dij(int start, vector<vector<pair<int, int>>> &g){
    vector<int> d(n, inf);
    d[start] = 0;
    set<pair<int, int>> q;
    for(int i = 0; i < n; i++){
        q.insert({d[i], i});
    }
    while(!q.empty()){
        auto [dd, u] = *q.begin();
        q.erase(q.begin());
        for(auto [i, j] : g[u]){
            if(dd + j < d[i]){
                q.erase({d[i], i});
                d[i] = dd + j;
                q.insert({d[i], i});
            }
        }
    }
    return d;
}

void solve(){
    int m;
    cin >> n >> m;
    v.resize(n);
    vector<array<int, 4>> z(m);
    for(int i = 0; i < m; i++){
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        a--;b--;
        z[i] = {a, b, c, d};
    }
    v.clear();
    v.resize(n);
    for(int i = 0; i < m; i++){
        auto [a, b, c, d] = z[i];
        v[a].emplace_back(b, c);
    }
    int ans = inf;
    auto d1 = dij(0, v);
    auto d2 = dij(n - 1, v);
    ans = min(ans, d1[n - 1] + d2[0]);
    for(int ind = 0; ind < m; ind++){
        v.clear();
        v.resize(n);
        for(int i = 0; i < m; i++){
            auto [a, b, c, d] = z[i];
            if(i != ind){
                v[a].emplace_back(b, c);
            }else{
                v[b].emplace_back(a, c);
            }
        }
        auto d1 = dij(0, v);
        auto d2 = dij(n - 1, v);
        ans = min(ans, d1[n - 1] + d2[0] + z[ind][3]);
    }
    if(ans >= inf){
        cout << -1 << endl;
        return;
    }
    cout << ans << endl;
}

signed main(){
#ifdef lisie_bimbi
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#else
#endif
    cin.tie(nullptr)->sync_with_stdio(false);
    int t = 1;
    //cin >> t;
    while(t--){
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...