#include<bits/stdc++.h>
using namespace std;
#define ii pair<long long,long long>
#define fi first
#define se second
const int MAXN=2e5+5;
const long long INF=1e18;
vector<ii> ds[MAXN];
priority_queue< ii,vector<ii>,greater<ii> > pq;
long long dp[MAXN],ans[MAXN][3],pdp[MAXN];
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n,m,s,t,u,v;
cin>>n>>m>>s>>t>>u>>v;
for(int i=1;i<=m;i++)
{
int l,r,v;
cin>>l>>r>>v;
ds[l].push_back({r,v}),ds[r].push_back({l,v});
}
for(int i=1;i<=n;i++) dp[i]=INF*(i!=s),pdp[i]=INF*(i!=t),ans[i][0]=ans[i][1]=ans[i][2]=INF*(i!=u);
pq.push({0,s});
while(!pq.empty())
{
long long a=pq.top().fi,b=pq.top().se;
pq.pop();
if(dp[b]<a) continue;
for(auto v:ds[b]) if(dp[v.fi]>a+v.se) pq.push({dp[v.fi]=a+v.se,v.fi});
}
pq.push({0,t});
while(!pq.empty())
{
long long a=pq.top().fi,b=pq.top().se;
pq.pop();
if(pdp[b]<a) continue;
for(auto v:ds[b]) if(pdp[v.fi]>a+v.se) pq.push({pdp[v.fi]=a+v.se,v.fi});
}
pq.push({0,u*3}),ans[u][1]=ans[u][2]=INF;
while(!pq.empty())
{
long long a=pq.top().fi,b=pq.top().se/3,c=pq.top().se%3;
pq.pop();
if(ans[b][c]<a) continue;
for(auto v:ds[b])
{
bool res=!(dp[b]+pdp[v.fi]+v.se==dp[t]);
if(c==0)
{
if(ans[v.fi][res]>a+v.se*res) pq.push({ans[v.fi][res]=a+v.se*res,v.fi*3+res});
}
else if(c==1)
{
if(ans[v.fi][c+1-res]>a+v.se*res) pq.push({ans[v.fi][c+1-res]=a+v.se*res,v.fi*3+c+1-res});
}
else
{
if(ans[v.fi][c]>a+v.se) pq.push({ans[v.fi][c]=a+v.se,v.fi*3+c});
}
}
}
cout<<min(ans[v][0],min(ans[v][1],ans[v][2]));
}
# | 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... |