#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
constexpr ll MAXN=1e5+5,MAXV=3e5,MOD=1e9+7,INF=1e18;
ll n,m,i,j,p,k,ans,dem,st,en,dist[3][MAXN],S,T,U,V,len[MAXN],miV[MAXN],miU[MAXN];
vector<pair<ll,ll>> adj[MAXN];
void dij(ll st,ll type){
priority_queue<pair<ll,ll>> q;
dist[type][st]=0;
q.push({0,st});
while(q.size()){
auto k=q.top();q.pop();
if(-k.fi>dist[type][k.se]) continue;
for(auto x:adj[k.se]){
if(dist[type][x.fi]>-k.fi+x.se){
dist[type][x.fi]=-k.fi+x.se;
q.push({-dist[type][x.fi],x.fi});
}
}
}
}
void solve(int start, int end) {
vector<ll> dist_from_start(n + 1, INF);
vector<ll> min_du_on_path(n + 1, INF);
vector<ll> min_dv_on_path(n + 1, INF);
dist_from_start[start] = 0;
min_du_on_path[start] = dist[1][start];
min_dv_on_path[start] = dist[2][start];
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
ll d = pq.top().first;
int u = pq.top().second;
pq.pop();
if (d > dist_from_start[u]) {
continue;
}
for (auto& edge : adj[u]) {
int v_neighbor = edge.first;
ll weight = edge.second;
ll new_dist = dist_from_start[u] + weight;
ll new_min_du = min(min_du_on_path[u], dist[1][v_neighbor]);
ll new_min_dv = min(min_dv_on_path[u], dist[2][v_neighbor]);
if (new_dist < dist_from_start[v_neighbor]) {
dist_from_start[v_neighbor] = new_dist;
min_du_on_path[v_neighbor] = new_min_du;
min_dv_on_path[v_neighbor] = new_min_dv;
pq.push({new_dist, v_neighbor});
}
else if (new_dist == dist_from_start[v_neighbor]) {
if (new_min_du + new_min_dv < min_du_on_path[v_neighbor] + min_dv_on_path[v_neighbor]) {
min_du_on_path[v_neighbor] = new_min_du;
min_dv_on_path[v_neighbor] = new_min_dv;
pq.push({new_dist, v_neighbor});
}
}
}
}
if (dist_from_start[end] != INF) {
ans = min(ans, min_du_on_path[end] + min_dv_on_path[end]);
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m>>S>>T>>U>>V;
for(i=1;i<=m;i++){
ll u,v,c;
cin>>u>>v>>c;
adj[u].pb({v,c});
adj[v].pb({u,c});
}
for(i=1;i<=n;i++) dist[1][i]=dist[2][i]=INF;
dij(U,1);
dij(V,2);
ans=dist[1][V];
solve(S,T);
solve(T,S);
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... |