Submission #758120

# Submission time Handle Problem Language Result Execution time Memory
758120 2023-06-14T07:46:12 Z jasmin Olympic Bus (JOI20_ho_t4) C++17
0 / 100
52 ms 8420 KB
#include<bits/stdc++.h>
using namespace std;
#define int long long

const int INF=1e17;

struct graph{
    vector<vector<pair<int,int> > >adi;
    vector<int> c;
    vector<int> d;

    graph(int n, int m){
        adi.assign(n, {});
        c.assign(m, 0);
        d.assign(m, 0);
    }

};

void dijkstra(int start, vector<int>& dist, vector<int>& par, int n, graph& g){

    dist.assign(n, INF);
    par.assign(n, -1);
    vector<bool> vis(n, false);
    priority_queue<pair<int,int> > pq;

    dist[start]=0;
    pq.push({-0, start});

    while(!pq.empty()){
        int v=pq.top().second;
        pq.pop();

        if(vis[v]){
            continue;
        }
        vis[v]=true;

        for(auto [u, ind]: g.adi[v]){

            if(dist[v]+g.c[ind] < dist[u]){
                par[u]=ind;
                dist[u] = dist[v] + g.c[ind];
                pq.push({-dist[u], u});
            }

        }
    }

}

vector<int> find_sp(int a, int b, vector<int>& par, vector<pair<int,int> >& edge, int m){
    vector<int> p;
    
    int v=b;
    while(v!=a){

        if(par[v]==-1){
            return {};
        }

        p.push_back(par[v]);
        v=edge[par[v]].first;
    }

    reverse(p.begin(), p.end());
    return p;
}

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

    int n, m;
    cin >> n >> m;
    graph g(n, m);
    graph rev(n, m);
    vector<pair<int,int> > edge(m);
    for(int i=0; i<m; i++){
        int a, b;
        cin >> a >> b >> g.c[i] >> g.d[i];
        a--; b--;
        g.adi[a].push_back({b, i});

        rev.c[i]=g.c[i];
        rev.d[i]=g.d[i];
        rev.adi[b].push_back({a, i});

        edge[i]={a, b};
    }

    //distances
    vector<int> par0(n, -1);
    vector<int> to0(n, INF);
    dijkstra(0, to0, par0, n, rev);
    vector<int> from0(n, INF);
    dijkstra(0, from0, par0, n, g);

    vector<int> parn(n, -1);
    vector<int> ton(n, INF);
    dijkstra(n-1, ton, parn, n, rev);
    vector<int> fromn(n, INF);
    dijkstra(n-1, fromn, parn, n, g);


    //paths
    vector<int> path1=find_sp(0, n-1, par0, edge, m);
    vector<int> path2=find_sp(n-1, 0, parn, edge, m);
    
    vector<bool> used(m, false);
    for(auto e: path1){
        used[e]=true;
    }
    for(auto e: path2){
        used[e]=true;
    }


    //possibility 0: turning no edge
    int ans=INF;
    ans = min(ans, from0[n-1] + fromn[0]);

    //possibility 1: edge not on path
    for(int i=0; i<m; i++){
        if(used[i]) continue;

        auto [a, b]=edge[i];

        int d1=from0[b] + g.c[i] + ton[a] + fromn[0];
        int d2=from0[n-1] + fromn[b] + g.c[i] + to0[a];

        int d=min(d1, d2) + g.d[i];
        ans=min(ans, d);
    }

    //possibility 2: edge on path
    vector<int> path=path1;
    for(auto e: path2) path.push_back(e);

    for(auto e: path){

        graph neu(n, m);
        for(int i=0; i<m; i++){
            neu.c[i]=g.c[i];
            neu.d[i]=g.d[i];

            auto [a, b]=edge[i];
            if(i==e){
                neu.adi[b].push_back({a, i});
            }
            else{
                neu.adi[a].push_back({b, i});
            }
        }

        int dis=g.d[e];
        vector<int> dist(n, INF);
        vector<int> p(n, -1);
        dijkstra(0, dist, p, n, neu);
        dis += dist[n-1];

        dijkstra(n-1, dist, p, n, neu);
        dis+=dist[0];

        ans=min(ans, dis);
    }

    //output
    if(ans==INF){
        cout << -1 << "\n";
    }
    else{
        cout << ans << "\n";
    }
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 2 ms 468 KB Output is correct
4 Correct 3 ms 464 KB Output is correct
5 Correct 1 ms 456 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 464 KB Output is correct
10 Correct 52 ms 520 KB Output is correct
11 Correct 48 ms 512 KB Output is correct
12 Correct 49 ms 524 KB Output is correct
13 Incorrect 1 ms 340 KB Output isn't correct
14 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 34 ms 7212 KB Output is correct
2 Correct 39 ms 8148 KB Output is correct
3 Correct 38 ms 8420 KB Output is correct
4 Correct 3 ms 604 KB Output is correct
5 Correct 2 ms 468 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 1 ms 320 KB Output is correct
9 Incorrect 21 ms 6408 KB Output isn't correct
10 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 492 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 22 ms 5420 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 26 ms 7044 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
7 Correct 0 ms 212 KB Output is correct
8 Incorrect 19 ms 5280 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 468 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 2 ms 468 KB Output is correct
4 Correct 3 ms 464 KB Output is correct
5 Correct 1 ms 456 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 1 ms 212 KB Output is correct
9 Correct 1 ms 464 KB Output is correct
10 Correct 52 ms 520 KB Output is correct
11 Correct 48 ms 512 KB Output is correct
12 Correct 49 ms 524 KB Output is correct
13 Incorrect 1 ms 340 KB Output isn't correct
14 Halted 0 ms 0 KB -