Submission #1264340

#TimeUsernameProblemLanguageResultExecution timeMemory
1264340avohadoCommuter Pass (JOI18_commuter_pass)C++20
100 / 100
297 ms30228 KiB
#include <bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define maxn 200005
#define f first
#define s second
#define ll long long
#define pb(x) push_back(x)
#define mp make_pair
int n, m, s, t, u1, v1, l[maxn], used[maxn];
long long fp[maxn], pth[maxn][4];
vector<pair<int, int>> g[maxn];
bool check(int u, int v, int r, int j){
    if(r){
        return (fp[v]+l[j]==fp[u]);
    }else{
        return (fp[u]+l[j]==fp[v]);
    }
}
void solve(){
    cin >> n >> m >> s >> t >> u1 >> v1;
    for(int i=0; i<m; i++){
        int u, v;
        cin >> u >> v >> l[i];
        g[u].pb(mp(v, i));
        g[v].pb(mp(u, i));
    }
    for(int i=0; i<=n; i++){
        fp[i]=INT64_MAX;
        for(int j=0; j<4; j++){
            pth[i][j]=fp[i];
        }
    }
    set<pair<long long, int>> st;
    st.insert({0, s});
    fp[s]=0;
    while(fp[t]>(*st.begin()).f){
        int u=(*st.begin()).s;long long w=(*st.begin()).f;
        st.erase(st.begin());
        if(fp[u]<w){
            continue;
        }
        for(auto v:g[u]){
            if(fp[v.f]>w+l[v.s]){
                fp[v.f]=w+l[v.s];
                st.insert(mp( fp[v.f],v.f));
            }
        }
    }
    queue<int> q;
    q.push(t);
    used[t]=1;
    while(q.size()){
        int u=q.front(); q.pop();
        for(auto v:g[u]){
            if(fp[v.f]+l[v.s]==fp[u]&&!used[v.f]){
                used[v.f]=1;
                q.push(v.f);
            }
        }
    }
    set<pair<long long, pair<int, int>>> st1;
    st1.insert({0, {u1, 2}});
    pth[u1][2]=pth[u1][1]=pth[u1][0]=0;
    if(used[u1]){
        st1.insert({0, {u1, 0}});
        st1.insert({0, {u1, 1}});
    }
    while((*st1.begin()).f<min({pth[v1][0],pth[v1][1],pth[v1][2],pth[v1][3]})){
        pair<long long,pair<int, int>> u=(*st1.begin());st1.erase(st1.begin());
        if(pth[u.s.f][u.s.s]<u.f){
            continue;
        }
        if(u.s.s>1){
            for(auto v:g[u.s.f]){
                if(pth[v.f][u.s.s]>u.f+l[v.s]){
                    pth[v.f][u.s.s]=u.f+l[v.s];
                    st1.insert({u.f+l[v.s], {v.f, u.s.s}});
                }
                if(u.s.s==2&&used[v.f]){
                    if(pth[v.f][0]>u.f+l[v.s]){
                        pth[v.f][0]=u.f+l[v.s];
                        st1.insert({u.f+l[v.s], {v.f, 0}});
                    }
                    if(pth[v.f][1]>u.f+l[v.s]){
                        pth[v.f][1]=u.f+l[v.s];
                        st1.insert({u.f+l[v.s], {v.f, 1}});
                    }
                }
            }
        }else{
            for(auto v:g[u.s.f]){
                if(used[v.f]&&check(u.s.f, v.f, u.s.s, v.s)&&pth[v.f][u.s.s]>u.f){
                    pth[v.f][u.s.s]=u.f;
                    st1.insert({u.f, {v.f, u.s.s}});
                }else if(pth[v.f][3]>u.f+l[v.s]){
                    pth[v.f][3]=u.f+l[v.s];
                    st1.insert({u.f+l[v.s], {v.f, 3}});
                }
            }
        }
    }
    cout << min({pth[v1][0],pth[v1][1],pth[v1][2],pth[v1][3]});
}
int main(){
    cin.tie(nullptr)->sync_with_stdio(0);
    int t=1;
    //cin >> t;
    while(t--){
        solve();
        cout << "\n";
    }
    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...