#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e5+10;
const int inf=1e15+10;
vector<pair<int,int>>adj[maxn];
vector<int>vim[maxn];
int dist[maxn][3], n, marc[maxn];
//dist[i][?] 0-> dist a partir do u, 1-> dist a partir do v, 2-> dist a partir do s
void dijkstra(int x, int t){
for(int i=1;i<=n;i++) dist[i][t]=inf;
dist[x][t]=0;
set<pair<int,int>>s;
for(int i=1;i<=n;i++) s.insert({dist[i][t],i});
while(!s.empty()){
auto f=s.begin();
int u=f->second;
s.erase(f);
for(auto p : adj[u]){
int viz=p.first, w=p.second;
if(dist[u][t]+w<dist[viz][t]){
s.erase({dist[viz][t],viz});
dist[viz][t]=dist[u][t]+w;
s.insert({dist[viz][t],viz});
vim[viz].clear();
}
if(dist[u][t]+w==dist[viz][t]&&t==2) vim[viz].push_back(u);
}
}
}
signed main()
{
ios_base::sync_with_stdio(false); cin.tie(NULL);
int m, s, t, u, v; cin >> n >> m >> s >> t >> u >> v;
for(int i=1;i<=m;i++){
int a, b, c; cin >> a >> b >> c;
adj[a].push_back({b,c});
adj[b].push_back({a,c});
}
dijkstra(u,0);
int resp=dist[v][0];
dijkstra(v,1);
dijkstra(s,2);
queue<int>q;
vim[s].clear();
marc[t]++;
for(auto a : vim[t]) q.push(a);
while(!q.empty()){
int at=q.front(); q.pop();
marc[at]++;
for(auto a : vim[at]){
if(marc[a]) continue;
q.push(a);
}
if(at==s) break;
}
int du=inf, dv=inf;
for(int i=1;i<=n;i++){
if(marc[i]){
du=min(du,dist[i][0]);
dv=min(dv,dist[i][1]);
}
}
if(marc[u]) du=0;
if(marc[v]) dv=0;
resp=min(resp,dv+du);
cout << resp << endl;
return 0;
}
//
# | 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... |