Submission #527609

#TimeUsernameProblemLanguageResultExecution timeMemory
527609LoboOlympic Bus (JOI20_ho_t4)C++17
11 / 100
120 ms3620 KiB
#include<bits/stdc++.h>
using namespace std;
 
const long long inf = (long long) 1e18 + 10;
const int inf1 = (int) 1e9 + 10;
#define int long long
#define dbl long double
#define endl '\n'
#define sc second
#define fr first
#define mp make_pair
#define pb push_back
#define all(x) x.begin(), x.end()
 
#define maxn 210
#define maxm 50010
 
int n, m, d[maxn][maxn], dx1[maxn][maxn], dxn[maxn][maxn];
pair<int,int> mn1[maxn], mnn[maxn];
int u[maxm], v[maxm], c[maxm], up[maxm];
vector<int> g[maxn];
 
void shpx1(int x) {
    for(int i = 1; i <= n; i++) {
        dx1[x][i] = inf;
    }
    if(x == 1) return;
 
    priority_queue<pair<int,int>> pq; pq.push(mp(0,1)); dx1[x][1] = 0;
 
    while(pq.size()) {
        int a = pq.top().sc;
        int dist = -pq.top().fr;
        pq.pop();
        if(dist != dx1[x][a]) continue;
 
        for(auto i : g[a]) {
            int b = v[i];
            int w = c[i];
            if(b == x) continue;
 
            if(dx1[x][b] > dx1[x][a] + w) {
                dx1[x][b] = dx1[x][a] + w;
                pq.push(mp(-dx1[x][b],b));
            }
        }
    }
}
 
 
void shpxn(int x) {
    for(int i = 1; i <= n; i++) {
        dxn[x][i] = inf;
    }
    if(x == n) return;
 
    priority_queue<pair<int,int>> pq; pq.push(mp(0,n)); dxn[x][n] = 0;
 
    while(pq.size()) {
        int a = pq.top().sc;
        int dist = -pq.top().fr;
        pq.pop();
        if(dist != dxn[x][a]) continue;
 
        for(auto i : g[a]) {
            int b = v[i];
            int w = c[i];
            if(b == x) continue;
 
            if(dxn[x][b] > dxn[x][a] + w) {
                dxn[x][b] = dxn[x][a] + w;
                pq.push(mp(-dxn[x][b],b));
            }
        }
    }
}
 
void solve() {
    cin >> n >> m;
 
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            d[i][j] = inf;
        }
 
        d[i][i] = 0;
    }
 
    for(int i = 1; i <= m; i++) {
        cin >> u[i] >> v[i] >> c[i] >> up[i];
        g[u[i]].pb(i);
 
        d[u[i]][v[i]] = min(d[u[i]][v[i]],c[i]);
    }
 
    for(int k = 1; k <= n; k++) {
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                d[i][j] = min(d[i][j],d[i][k]+d[k][j]);
            }
        }
    }
 
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            // cout << i << " " << j << " " << d[i][j] << endl;
        }
    }
 
    //tenho que pegar dx1 e dxn
    for(int i = 1; i <= n; i++) {
        shpx1(i);
        shpxn(i);
    }
    //pegar o menor/segundo menor de cada cara
 
    for(int a = 1; a <= n; a++) {
        mn1[a] = mp(inf,inf);
        if(a == n) mn1[a] = mp(0,inf);
 
        for(auto i : g[a]) {
            int b = v[i];
            // cout << " " << a << " " << b << endl;
 
            mn1[a].sc = min(mn1[a].sc, d[1][a] + c[i] + d[b][n]);
 
            if(mn1[a].sc < mn1[a].fr) swap(mn1[a].fr,mn1[a].sc);
        }
 
        // cout << a << " " << mn1[a].fr << " " << mn1[a].sc << endl;
    }
    
    for(int a = 1; a <= n; a++) {
        mnn[a] = mp(inf,inf);
        if(a == 1) mnn[a] = mp(0,inf);
 
        for(auto i : g[a]) {
            int b = v[i];
 
            mnn[a].sc = min(mnn[a].sc, d[n][a] + c[i] + d[b][1]);
 
            if(mnn[a].sc < mnn[a].fr) swap(mnn[a].fr,mnn[a].sc);
        }
    }
 
    int ans = inf;
    ans = min(ans, d[1][n]+d[n][1]);
 
    //usa no 1->n
    for(int i = 1; i <= m; i++) {
        int ans1 = 0;
 
        if(d[n][1] == d[n][u[i]] + c[i] + d[v[i]][1]) {
            ans1 = min(dxn[u[i]][1], mnn[u[i]].sc);
        }
        else {
            ans1 = d[n][1];
        }
 		
      	ans1 = min(ans1,d[n][v[i]]+c[i]+d[u[i]][1]);
        ans1+= d[1][v[i]]+c[i]+up[i]+d[u[i]][n];
        ans = min(ans,ans1);
    }
 
    //usa no n->1
    for(int i = 1; i <= m; i++) {
        int ans1 = 0;
 
        if(d[1][n] == d[1][u[i]] + c[i] + d[v[i]][n]) {
            ans1 = min(dx1[u[i]][n], mn1[u[i]].sc);
        }
        else {
            ans1 = d[1][n];
        }
        
        ans1 = min(ans1,d[1][v[i]]+c[i]+d[u[i]][n]);
        ans1+= d[n][v[i]]+c[i]+up[i]+d[u[i]][1];
        ans = min(ans,ans1);
    }
 
    if(ans == inf) cout << -1 << endl;
    else cout << ans << endl;
 
}
 
int32_t main() {
    ios::sync_with_stdio(false); cin.tie(0);
 
    // freopen("in.in", "r", stdin);
    //freopen("out.out", "w", stdout);
    
    int tt = 1;
    // cin >> tt;
    while(tt--) 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...