#include <iostream>
#include <bits/stdc++.h>
using namespace std;
struct arbore {
    bool directie;///0 = s->t , 1 = t->s
    long long nod,cost,stare,c_urcat;
    bool  operator>(const arbore & o)const {
        return cost > o.cost;
    }
/// 1. nu ne-am pus pe un drum cu 0 -> urcam pe unul <-> d[s][nod_curent] + cost + d[u][vecin]
///    acum, odata ce am "urcat pe o directie" s->t sau t->s, trebuie sa o mentin
///
/// +++ tinem costul cu care ne-am urcat prima data !!!
/// 2. sunt pe o secv de costuri 0 -> pot merge pe o muchie care e din acelasi drum minim
///    normal luand dupa directie, <-> atunci c_urcat + c_vecin + cost == dmin
///                                    daca e s->t atunci c_urcat creste
///                                    daca e t->s atunci c_urcat ... tot creste
///in fiecare punct cu stare 2 verificam rezultatul
};
struct arbore2 {
    long long nod,cost;
    bool operator>(const arbore2 & o)const {
        return cost > o.cost;
    }
};
vector<long long>ds,dt,dv,du;
vector<vector<arbore2>>tabel;
long long dp[100001][2],dmin=1e18,rez=1e18;///nodul, directie, folosim doar cand stare == 1, altfel doar du
///dijkstra normal
void dijksrtra1(vector<long long> & d,long long start) {
    priority_queue<arbore2,vector<arbore2>,greater<arbore2>>pq;
    pq.push({start,0});
    d[start] = 0;
    while(!pq.empty()) {
        auto curent = pq.top();
        pq.pop();
        if(d[curent.nod] < curent.cost)
            continue;
        for(auto i : tabel[curent.nod]) {
            if(d[i.nod] > curent.cost + i.cost) {
                d[i.nod] = curent.cost + i.cost;
                pq.push({i.nod,d[i.nod]});
            }
        }
    }
}
///acum e acum
///dijkstra principala
void dijksrtra2(long long u,long long v,long long s,long long t) {
    ///acum initializez in main dp sa fie doar chestii mari
    priority_queue<arbore,vector<arbore>,greater<arbore>>pq;
    pq.push({0,u,0,0,0});
    du[u] = 0;
    while(!pq.empty()) {
        auto curent = pq.top();
        pq.pop();
        if(curent.stare == 0) { ///nu am urcat inca in tren
            if(du[curent.nod] < curent.cost)
                continue;
            for(auto i : tabel[curent.nod]) {
                ///acum putem continua normal sau sa urcam
                ///normal
                if(du[i.nod] > curent.cost + i.cost){
                    du[i.nod] = curent.cost + i.cost;
                    pq.push({0,i.nod,du[i.nod],0,0});
                }
                ///acum putem urca
                ///s->t
                //cout<<ds[curent.nod] + i.cost + dt[i.nod]<<'\n';
                if(ds[curent.nod] + i.cost + dt[i.nod] == dmin && dp[i.nod][0] > curent.cost + dv[i.nod]){
                    dp[i.nod][0] = curent.cost + dv[i.nod];
                    rez = min(rez, dp[i.nod][0]);
                    pq.push({0,i.nod,curent.cost,1,ds[curent.nod] + i.cost});
                }
                ///t->s
                //cout<<dt[curent.nod] + i.cost + ds[i.nod]<<'\n';
                if(dt[curent.nod] + i.cost + ds[i.nod] == dmin && dp[i.nod][1] > curent.cost + dv[i.nod]){
                    dp[i.nod][1] = curent.cost + dv[i.nod];
                    rez = min(rez, dp[i.nod][1]);
                    pq.push({1,i.nod,curent.cost,1,dt[curent.nod] + i.cost});
                }
            }
        }
        if(curent.stare == 1){
            if(curent.directie == 1){///t->s
                if(dp[curent.nod][1] < curent.cost + dv[curent.nod])
                    continue;
                for(auto i : tabel[curent.nod]){
                    if(curent.c_urcat + i.cost + ds[i.nod] == dmin && dp[i.nod][1] > curent.cost + dv[i.nod]){
                        dp[i.nod][1] = curent.cost + dv[i.nod];
                        rez = min(rez,dp[i.nod][1]);
                        pq.push({1,i.nod,curent.cost,1,curent.c_urcat + i.cost});
                    }
                }
            }
            if(curent.directie == 0){///s->t
                if(dp[curent.nod][0] < curent.cost + dv[curent.nod])
                    continue;
                for(auto i : tabel[curent.nod]){
                    if(curent.c_urcat + i.cost + dt[i.nod] == dmin && dp[i.nod][0] > curent.cost + dv[i.nod]){
                        dp[i.nod][0] = curent.cost + dv[i.nod];
                        rez = min(rez,dp[i.nod][0]);
                        pq.push({0,i.nod,curent.cost,1,curent.c_urcat + i.cost});
                    }
                }
            }
        }
    }
}
int main() {
    long long n,m;
    cin>>n>>m;
    long long s,t,u,v;
    cin>>s>>t>>u>>v;
    dt.resize(n+1,1e18);
    ds.resize(n+1,1e18);
    du.resize(n+1,1e18);
    dv.resize(n+1,1e18);
    tabel.resize(n+1);
    for(long long i=1;i<=n;i++)
        dp[i][0] = dp[i][1] = 1e18;
    for(long long i=1;i<=m;i++){
        long long a,b,c;
        cin>>a>>b>>c;
        tabel[a].push_back({b,c});
        tabel[b].push_back({a,c});
    }
    dijksrtra1(dt,t);
    dijksrtra1(ds,s);
    dijksrtra1(dv,v);
    dmin = ds[t];
    rez = dv[u];
    dijksrtra2(u,v,s,t);
    cout<<rez;
    return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |