Submission #1273694

#TimeUsernameProblemLanguageResultExecution timeMemory
1273694icebearOlympic Bus (JOI20_ho_t4)C++20
0 / 100
16 ms1980 KiB
// ~~ icebear ~~
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> ii;
typedef pair<int, ii> iii;

template<class T>
    bool minimize(T &a, const T &b) {
        if (a > b) return a = b, true;
        return false;
    }

template<class T>
    bool maximize(T &a, const T &b) {
        if (a < b) return a = b, true;
        return false;
    }

#define FOR(i,a,b) for(int i=(a); i<=(b); ++i)
#define FORR(i,a,b) for(int i=(a); i>=(b); --i)
#define REP(i, n) for(int i=0; i<(n); ++i)
#define RED(i, n) for(int i=(n)-1; i>=0; --i)
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define all(x) x.begin(), x.end()
#define task "icebear"

const int MOD = 1e9 + 7;
const int inf = 1e9 + 27092008;
const ll INF = 1e18 + 27092008;
const int N = 1e5 + 5;
int n, m, a[N], b[N], c[N], d[N];
vector<int> G[2][N];
bool in_path[N];
ll dist[2][2][N], tmp[N];
int par[N], edge[N];

void dijkstra(int s, ll dist[N], const vector<int> *G) {
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> Q;
    fill(dist, dist + n + 1, INF);
    fill(par, par + n + 1, 0);
    Q.push(mp(0, s));
    dist[s] = 0;

    while(!Q.empty()) {
        int u; ll du;
        tie(du, u) = Q.top(); Q.pop();
        if (du != dist[u]) continue;
        for(int i : G[u]) {
            int v = a[i] ^ b[i] ^ u;
            if (minimize(dist[v], dist[u] + c[i])) {
                par[v] = u;
                edge[v] = i;
                Q.push(mp(dist[v], v));
            }
        }
    }

    for(int t = n; t; t = par[t]) in_path[edge[t]] = true;
}

ll calcDist(int s, int id, ll dist[N]) {
    priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> Q;
    fill(dist, dist + n + 1, INF);
    Q.push(mp(0, s));
    dist[s] = 0;

    while(!Q.empty()) {
        ll du; int u;
        tie(du, u) = Q.top(); Q.pop();
        if (du != dist[u]) continue;
        for(int i : G[0][u]) {
            if (id == i) continue;
            int v = a[i] ^ b[i] ^ u;
            if (minimize(dist[v], dist[u] + c[i]))
                Q.push(mp(dist[v], v));
        }

        int v = b[id];
        if (u == a[id] && minimize(dist[v], dist[u] + c[id])) Q.push(mp(dist[v], v));
     }
     return dist[s == 1 ? n : 1];
}

void init(void) {
    cin >> n >> m;
    FOR(i, 1, m) {
        cin >> a[i] >> b[i] >> c[i] >> d[i];
        G[0][a[i]].pb(i);
        G[1][b[i]].pb(i);
    }
}

void process(void) {
    dijkstra(1, dist[0][0], G[0]); dijkstra(n, dist[0][1], G[0]);
    dijkstra(n, dist[1][0], G[1]); dijkstra(1, dist[1][1], G[1]);


    ll ans = min(INF, dist[0][0][n] + dist[0][1][1]);

    FOR(i, 1, m) {
        if (in_path[i]) minimize(ans, calcDist(1, i, tmp) + calcDist(n, i, tmp) + d[i]);
        else {
            int u = a[i], v = b[i];
            ll dist1 = min(dist[0][0][n], dist[0][0][v] + dist[1][0][u] + c[i]);
            ll dist2 = min(dist[0][1][1], dist[0][1][v] + dist[1][1][u] + c[i]);
            minimize(ans, dist1 + dist2 + d[i]);
        }
    }
    cout << (ans == INF ? -1 : ans);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    if (fopen(task".inp", "r")) {
        freopen(task".inp", "r", stdin);
        freopen(task".out", "w", stdout);
    }
    int tc = 1;
//    cin >> tc;
    while(tc--) {
        init();
        process();
    }
    return 0;
}

Compilation message (stderr)

ho_t4.cpp: In function 'int main()':
ho_t4.cpp:123:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  123 |         freopen(task".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
ho_t4.cpp:124:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  124 |         freopen(task".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...