This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
#define ll long long
#define se second
#define fi first
#define pll pair<ll,ll>
#define maxn 100005
#define task "XEBUYT"
using namespace std;
const ll inf=1e18;
ll n,m,s,t,u,v,du[maxn],dv[maxn],ans,ds[maxn],dp[3][maxn];
bool vs[maxn];
vector<pll> g[maxn];
void djk1(ll st,ll d[]){
priority_queue<pll> q;
fill(vs,vs+maxn,false);
q.push({0,st});
while(!q.empty()){
ll node,w;
tie(w,node)=q.top();
q.pop();
if(!vs[node]){
vs[node]=true;
d[node]=-w;
for(pll it:g[node]) q.push({w-it.se,it.fi});
}
}
}
void djk2(ll st, ll ed){
priority_queue<pair<ll,pll>> q;
fill(vs,vs+maxn,false);
fill(dp[0], dp[0] + 100001, LLONG_MAX / 2);
fill(dp[1], dp[1] + 100001, LLONG_MAX / 2);
dp[0][0]=dp[1][0]= inf;
q.push({0,{st,0}});
while(!q.empty()){
ll w,node,par;pll p;
tie(w,p)=q.top();
tie(node,par)=p;
q.pop();
if(!vs[node]){
vs[node]=true;
ds[node]=-w;
dp[0][node]=min(du[node],dp[0][par]);
dp[1][node]=min(dv[node],dp[1][par]);
for(pll it:g[node]) q.push({w-it.se,{it.fi,node}});
}
else if(-w==ds[node] and min(dp[0][par],du[node])+min(dv[node],dp[1][par])<=dp[1][node]+dp[0][node]){
dp[0][node]=min(dp[0][par],du[node]);
dp[1][node]=min(dv[node],dp[1][par]);
}
}
ans=min(ans,dp[0][ed]+dp[1][ed]);
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if(fopen(task".INP","r")){
freopen(task".INP","r",stdin);
freopen(task".OUT","w",stdout);
}
cin>>n>>m>>s>>t>>u>>v;
for(long i=0;i<m;i++){
ll a,b,c;
cin>>a>>b>>c;
g[a].push_back({b,c});
g[b].push_back({a,c});
}
djk1(u,du); djk1(v,dv);
ans=du[v];
djk2(s,t); djk2(t,s);
cout<<ans;
return 0;
}
Compilation message (stderr)
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:71:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
71 | freopen(task".INP","r",stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:72:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
72 | freopen(task".OUT","w",stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
# | 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... |