#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int,int>>adj[200005];
int dis[200005];
int inf=1e15;
vector<int>back[200005];
int vis[200005];
int n,m;
vector<pair<int,int>>edge;
void dijkstra(int s){
    priority_queue<pair<int,pair<int,int>>,vector<pair<int,pair<int,int>>>,greater<pair<int,pair<int,int>>>>pq;
    for(int i=1;i<=n;i++)dis[i]=inf;
    pq.push({0,{s,s}});
    while(!pq.empty()){
        auto [d,x]=pq.top();
        int u=x.first;
        int p=x.second;
        pq.pop();
        if(d<=dis[u])back[u].push_back(p);
        if(d>=dis[u])continue;
        dis[u]=d;
        for(auto x:adj[u]){
            pq.push({x.second+d,{x.first,u}});
        }
    }
}
int ndis[200005][2][2];
struct node{
    int dis,use,on,u;
    node(int _dis,int _use,int _on,int _u){
        dis=_dis,use=_use,on=_on,u=_u;
    }
    friend bool operator<(node a,node b){
        return a.dis>b.dis;
    }
};
void dijkstra2(int s){
    priority_queue<node>pq;
    for(int i=1;i<=n;i++)ndis[i][0][0]=ndis[i][0][1]=ndis[i][1][1]=ndis[i][1][0]=inf;
    pq.push(node(0,0,0,s));
    while(!pq.empty()){
        auto x=pq.top();
        pq.pop();
        if(x.dis>=ndis[x.u][x.use][x.on])continue;
        ndis[x.u][x.use][x.on]=x.dis;
        //cerr<<x.u<<" "<<x.dis<<" "<<x.use<<" "<<x.on<<"\n";
        for(auto v:adj[x.u]){
            if(v.second==0){
                if(x.use&&!x.on)continue;
                pq.push(node(x.dis+v.second,1,1,v.first));
            }else{
                pq.push(node(x.dis+v.second,x.use,0,v.first));
            }
        }
    }
    //cerr<<"\n";
}
void bt(int u,int s){
    if(u==s)return;
    for(auto x:back[u]){
        if(!vis[x])edge.push_back({x,u}),bt(x,u),vis[x]=1;
    }
}
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    int s,t;cin>>s>>t;
    int u,v;cin>>u>>v;
    for(int i=0;i<m;i++){
        int a,b,c;cin>>a>>b>>c;
        adj[a].push_back({b,c});
        adj[b].push_back({a,c});
    }
    dijkstra(s);
    //for(int i=1;i<=n;i++)cerr<<dis[i]<<" ";
    //cerr<<"\n";
    vis[t]=1;
    bt(t,s);
    for(auto x:edge){
        adj[x.first].push_back({x.second,0});
    }
    int ans=inf;
    dijkstra2(u);
    //for(int i=1;i<=n;i++)cerr<<dis[i]<<" ";
    //cerr<<"\n";
    ans=min({ans,ndis[v][0][0],ndis[v][0][1],ndis[v][1][0],ndis[v][1][1]});
    dijkstra2(v);
    ans=min({ans,ndis[u][0][0],ndis[u][0][1],ndis[u][1][0],ndis[u][1][1]});
    cout<<ans;
}
| # | 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... |