Submission #1315429

#TimeUsernameProblemLanguageResultExecution timeMemory
1315429vedchoudharyOlympic Bus (JOI20_ho_t4)C++20
5 / 100
1095 ms5892 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("O3")

using namespace std;

using ll = long long;
#define int ll

const int INF = (int)4e18;

struct Edge {
    int s,e;
    int c,d;
    Edge(){};
    Edge(int _u, int _v, int _c, int _d) : s(_u), e(_v), c(_c), d(_d) {};
};

bool operator < (const Edge& a, const Edge& b) {
    if(a.s!=b.s) return a.s < b.s;
    if(a.e!=b.e) return a.e < b.e;
    if(a.c!=b.c) return a.c < b.c;
    return a.d < b.d;
}

int n,m;
set<Edge> adj[201];
vector<Edge> e;

int dijkstra(int s, int e) {
    vector<int> dist(n+1,INF);
    vector<bool> seen(n+1,false);
    dist[s] = 0;
    priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq; pq.push({0,s});
    while(!pq.empty()) {
        auto [d,curr] = pq.top(); pq.pop();
        if(dist[curr]<d||seen[curr]) continue;
        for(Edge r : adj[curr]) {
            if(d+r.c<dist[r.e]&&!seen[r.e]) { pq.push({d+r.c,r.e}); dist[r.e] = d+r.c; }
        }
        seen[curr] = true;
    }
    return dist[e];
}

signed main() {
    cin >> n >> m;
    e.reserve(m);
    for(int i = 0; i < m; i++) {
        int u,v,c,d; cin >> u >> v >> c >> d;
        adj[u].insert(Edge(u,v,c,d));
        e.push_back(Edge(u,v,c,d));
    }
    int ans = dijkstra(1,n)+dijkstra(n,1);
    for(Edge r : e) {
        adj[r.s].erase(r);
        adj[r.e].insert(Edge(r.e,r.s,r.c,r.d));
        ans = min(ans,r.d+dijkstra(1,n)+dijkstra(n,1));
        adj[r.e].erase(Edge(r.e,r.s,r.c,r.d));
        adj[r.s].insert(r);
    }
    cout << ((ans<INF)?ans:-1);
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...