#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef vector<int> vi;
typedef vector<vi> vii;
typedef pair<int,int> pi;
typedef vector<pi> pii;
typedef tuple<int,int,int> ti;
typedef vector<ll> li;
typedef vector<li> lii;
#define REP(i,a,b) for(int i=a;i<b;i++)
#define F first
#define S second
#define PB push_back
#define LSOne(s) ((s)&(-s))
#define all(x) (x).begin(),(x).end()
ll INF=1000000000000000010;
int inf=1e9+10;
ll M=1e9+7;
vector<vector<pair<int,ll>>> a;
vii p;
int n,m,S,T,U,V;
void djisktra(int s,vector<ll> &dist,vii &p){
priority_queue<pair<ll,int>,vector<pair<ll,int>>,greater<pair<ll,int>>> pq;
pq.push({0,s});
dist[s]=0;
p.clear();p.resize(n);
while(!pq.empty()){
ll x=pq.top().F;
int y=pq.top().S;
pq.pop();
if(dist[y]>x)continue;
for(auto [u,v]:a[y]){
if(dist[u]==dist[y]+v)p[u].PB(y);
if(dist[u]>dist[y]+v){
p[u].clear();
dist[u]=dist[y]+v;
p[u].PB(y);
pq.push({dist[u],u});
}
}
}
}
ll solve(int x,vector<ll> &dp,vector<ll> &dist){
if(dp[x]!=INF)return dp[x];
dp[x]=dist[x];
for(auto u:p[x])dp[x]=min(dp[x],solve(u,dp,dist));
return dp[x];
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n>>m>>S>>T>>U>>V;
S--;T--;U--;V--;
a.resize(n);
REP(i,0,m){
int x,y;cin>>x>>y;
x--;y--;
ll z;cin>>z;
a[x].PB({y,z});
a[y].PB({x,z});
}
vector<ll> distU(n,INF),distV(n,INF),dist(n,INF);
djisktra(U,distU,p);
djisktra(V,distV,p);
djisktra(S,dist,p);
vector<ll> dpU(n,INF),dpV(n,INF);
solve(T,dpU,distU);
solve(T,dpV,distV);
ll ans=distU[V];
REP(i,0,n){
ans=min(ans,distU[i]+dpV[i]);
ans=min(ans,distV[i]+dpU[i]);
}
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... |