제출 #1115190

#제출 시각아이디문제언어결과실행 시간메모리
1115190staszic_ojuzOlympic Bus (JOI20_ho_t4)C++17
0 / 100
1091 ms12372 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <numeric>
#include <cmath>

typedef long long ll;

using namespace std;

struct edge {
    ll v;
    ll c;
    ll d;
};

ll dfs(vector<vector<edge>> graf, ll n0, ll n1, ll n, edge block, ll blockstart) {
    vector<bool> vis(n + 1, false);
    edge e;
    e.v = blockstart;
    e.c = block.c;
    e.d = block.d;
    if(blockstart != 0) {
    graf[block.v].push_back(e);
    }
    vector<ll> odl(n + 1, 1);
    odl[n0] = 0;
    priority_queue<pair<ll, ll>> q;
    q.push({0, n0});
    while(!q.empty()) {
        ll v = q.top().second;
        ll w = q.top().first;
        q.pop();
        vis[v] = true;
        for(edge se : graf[v]) {
            if(v == blockstart && se.v == block.v && se.c == block.c && se.d == block.d) continue;
            if(!vis[se.v]) {
                if(odl[se.v] < 0) {q.push({se.c, se.v});odl[se.v] = w + se.c;}
                if(odl[se.v] > (se.c + w)) {
                    q.push({se.c, se.v});
                    odl[se.v] = se.c + w;
                }
            }
        }
    }
    //cout << odl[n1] << '\n';
    return odl[n1];
}

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

    ll n, m; cin >> n >> m;

    vector<vector<edge>> graf(n + 1);
    vector<pair<ll, edge>> edgelist;
    for(int i = 0; i < m; i++) {
        ll u, v, c, d; cin >> u >> v >> c >> d;
        edge e;
        e.v = v;
        e.c = -1 * c;
        e.d = d;
        graf[u].push_back(e);
        edgelist.push_back({u, e});
    }
    ll d1 = -1 * dfs(graf, 1, n, n, edge(), 0);
    ll d2 = -1 * dfs(graf, n, 1, n, edge(), 0);
    ll mn = (d1 >= 0 && d2 >= 0 ? d1 + d2 : -1);
    for(int i = 0; i < m; i++) {
        ll v = edgelist[i].first;
        edge e = edgelist[i].second;
        ll d1 = -1 * dfs(graf, 1, n, n, e, v);
        ll d2 = -1 * dfs(graf, n, 1, n, e, v);
        //cout << d1 << " " << d2 << '\n';
        if(d1 < 0 || d2 < 0) continue;
        mn = min(mn, d1 + d2 + e.d);
    }
    cout << mn;



    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...