Submission #1298454

#TimeUsernameProblemLanguageResultExecution timeMemory
1298454khoavn2008Bitaro the Brave (JOI19_ho_t1)C++17
0 / 100
2 ms5176 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define FOR(i,l,r) for(int i = (l), _r = (r); i <= _r; i++)
#define FORNG(i,r,l) for(int i = (r), _l = (l); i >= _l; i--)
#define REP(i,r) for(int i = 0, _r = (r); i < _r; i++)
#define endl '\n'
#define fi first
#define se second
#define pb push_back
#define size(v) ((ll)(v).size())
#define all(v) (v).begin(),(v).end()
#define MASK(x) (1LL << (x))
#define BIT(x,i) (((x) >> (i)) & 1)
const ll MOD = 1e9 + 7, N = 2e5 + 36, LOG = 18;
const ll INF = 1e18 + 20;
int n,m,s,t,p,q;
vector<pair<int,int>> adj[N];
ll d1[N],d2[N],dd[N],dp[N][2];
ll ans = INF;
void dijk(int st,ll d[]){
    FOR(i,1,n)d[i] = INF;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> qu;
    qu.push({0, st});
    d[st] = 0;
    while(!qu.empty()){
        ll dist = qu.top().fi;
        int u = qu.top().se;
        qu.pop();
        if(dist > d[u])continue;
        for(auto &[v, w] : adj[u]){
            if(dist + w < d[v]){
                d[v] = dist + w;
                qu.push({d[v], v});
            }
        }
    }
}
void dijk2(int st,int ed){
    FOR(i,1,n)dp[i][0] = dp[i][1] = dd[i] = INF;
    priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<pair<ll,int>>> qu;
    dp[st][0] = d1[st];
    dp[st][1] = d2[st];
    qu.push({0, st});
    while(!qu.empty()){
        ll dist = qu.top().fi;
        int u = qu.top().se;
        qu.pop();
        if(dist > dd[u])continue;
        for(auto &[v, w] : adj[u]){
            if(dist + w == dd[v]){
                dp[v][0] = min(dp[u][0], d1[v]);
                dp[v][1] = min(dp[u][1], d2[v]);
            }
            if(dist + w < dd[v]){
                dd[v] = dist + w;
                dp[v][0] = min(dp[u][0], d1[v]);
                dp[v][1] = min(dp[u][1], d2[v]);
                qu.push({dd[v], v});
            }
        }
    }
    ans = min(ans, dp[ed][0] + dp[ed][1]);
}
int main(){
    //freopen(".INP", "r", stdin);
    //freopen(".OUT", "w", stdout);
    ios_base::sync_with_stdio(0);cin.tie(0);
    cin>>n>>m;
    cin>>s>>t;
    cin>>p>>q;
    FOR(i,1,m){
        int u,v,w;cin>>u>>v>>w;
        adj[u].pb({v, w});
        adj[v].pb({u, w});
    }
    dijk(p, d1);
    dijk(q, d2);

    ans = d1[q];
    
    dijk2(s, t);
    dijk2(t, s);

    cout<<ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...