Submission #1106141

#TimeUsernameProblemLanguageResultExecution timeMemory
1106141Trisanu_DasOlympic Bus (JOI20_ho_t4)C++17
5 / 100
1061 ms4820 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ff first
#define ss second

vector<multiset<pair<int, int> > > adj;
vector<ll> sssp1, sssp2;

void dijkstra(int u, vector<ll>& sssp){
    priority_queue<pair<ll, int>, vector<pair<ll, int> >, greater<pair<ll, int> > > pq;
    pq.push({sssp[u] = 0ll, u});
    while(!pq.empty()) {
        int x = pq.top().ss;
        pq.pop();
        for(auto [y, w] : adj[x])
            if(sssp[x] + w < sssp[y])
                pq.push({sssp[y] = sssp[x] + w, y});
    }
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int n, m; cin >> n >> m;
    adj.resize(n);
    vector<tuple<int, int, int, int> > edges;
    for(int i = 0; i < m; i++){
        int u, v, c, d; cin >> u >> v >> c >> d;
        u--; v--;
        adj[u].insert({v, c});
        edges.push_back(make_tuple(u, v, c, d));
    }
    sssp1 = sssp2 = vector<ll>(n, INT_MAX);
    dijkstra(0, sssp1);
    dijkstra(n - 1, sssp2);
    ll ans = min((ll)INT_MAX, sssp1[n - 1] + sssp2[0]);
    for(auto [u, v, c, d] : edges){
        adj[u].erase(adj[u].find({v, c}));
        adj[v].insert({u, c});
        sssp1 = sssp2 = vector<ll>(n, INT_MAX);
        dijkstra(0, sssp1);
        dijkstra(n - 1, sssp2);
        ans = min(ans, sssp1[n - 1] + sssp2[0] + d);
        adj[v].erase(adj[v].find({u, c}));
        adj[u].insert({v, c});
    }
    cout << (ans == INT_MAX ? -1 : ans) << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...