Submission #1342623

#TimeUsernameProblemLanguageResultExecution timeMemory
1342623minhtienCommuter Pass (JOI18_commuter_pass)C++20
0 / 100
84 ms10284 KiB
#include <bits/stdc++.h>
#define ll long long
#define ii pair<ll,ll>
#define iiii pair<ll,pair<ll,pair<ll,ll>>>
#define iii pair<ll,pair<ll,ll>>
#define fi first
#define se second
using namespace std;
const int N=1e5+6;
const ll inf=1e18;
vector<ii>v1[N];
vector<iii>v2(N);
int a2[N];
ll n,m,s,t,u,v;
vector<ii>v3[N];
ll dp[N],dp1[N];
void dick(int s){
    for(int i=1;i<=n;i++){
        dp[i]=inf;
    }
    dp[s]=0;
    priority_queue<ii,vector<ii>,greater<ii>>q;
    q.push({dp[s],s});
    while(!q.empty()){
        ll s1=q.top().fi;
        int node=q.top().se;
        q.pop();
        if(s1>dp[node]) continue;
        for(auto x:v1[node]){
            int node1=x.fi;
            ll s2=x.se;
            if(dp[node1]>dp[node]+s2){
                dp[node1]=dp[node]+s2;
                q.push({dp[node1],node1});
            }
        }
    }
}
void dick1(int s){
    for(int i=1;i<=n;i++){
        dp1[i]=inf;
    }
    dp1[s]=0;
    priority_queue<ii,vector<ii>,greater<ii>>q;
    q.push({dp1[s],s});
    while(!q.empty()){
        ll s1=q.top().fi;
        int node=q.top().se;
        q.pop();
        if(s1>dp1[node]) continue;
        for(auto x:v1[node]){
            int node1=x.fi;
            ll s2=x.se;
            if(dp1[node1]>dp1[node]+s2){
                dp1[node1]=dp1[node]+s2;
                q.push({dp1[node1],node1});
            }
        }
    }
}
void dick2(int s){
    for(int i=1;i<=n;i++){
        dp[i]=inf;
    }
    dp[s]=0;
    priority_queue<ii,vector<ii>,greater<ii>>q;
    q.push({dp[s],s});
    while(!q.empty()){
        ll s1=q.top().fi;
        int node=q.top().se;
        q.pop();
        if(s1>dp[node]) continue;
        for(auto x:v3[node]){
            int node1=x.fi;
            ll s2=x.se;
            if(dp[node1]>dp[node]+s2){
                dp[node1]=dp[node]+s2;
                q.push({dp[node1],node1});
            }
        }
    }
}
//void dick3(int s){
//    for(int i=1;i<=n;i++){
//        dp1[i]=inf;
//    }
//    dp1[s]=0;
//    priority_queue<ii,vector<ii>,greater<ii>>q;
//    q.push({dp1[s],s});
//    while(!q.empty()){
//        ll s1=q.top().fi;
//        int node=q.top().se;
//        q.pop();
//        if(s1>dp1[node]) continue;
//        for(auto x:v3[node]){
//            int node1=x.fi;
//            ll s2=x.se;
//            if(dp1[node1]>dp1[node]+s2){
//                dp1[node1]=dp1[node]+s2;
//                q.push({dp1[node1],node1});
//            }
//        }
//    }
//}
int main()
{
    cin >>n >>m >>s >>t >>u >>v;
    for(int i=1;i<=m;i++){
        int x,y,w;
        cin >>x >>y >>w;
        v2[i]={x,{y,w}};
        v1[x].push_back({y,w});
        v1[y].push_back({x,w});
    }
    dick(s);
    dick1(t);
    ll sum=dp[t];
    for(int i=1;i<=m;i++){
        int node=v2[i].fi;
        int node1=v2[i].se.fi;
        ll sum1=v2[i].se.se;
        if(dp[node]!=inf && dp1[node1]!=inf){
            if(dp[node]+dp1[node1]+sum1==sum){
                a2[i]=1;
            }
        }
        if(dp[node1]!=inf && dp1[node]!=inf){
            if(dp[node1]+dp1[node]+sum1==sum){
                a2[i]=1;
            }
        }
    }
    for(int i=1;i<=m;i++){
        int node=v2[i].fi;
        int node1=v2[i].se.fi;
        ll sum1=v2[i].se.se;
        if(a2[i]==1){
            v3[node].push_back({node1,0});
            v3[node1].push_back({node,0});
        }
        else{
            v3[node].push_back({node1,sum1});
            v3[node1].push_back({node,sum1});
        }
    }
    dick2(u);
    cout << dp[v];
    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...