#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int n, m, s, t, ss, tt, ans = LLONG_MAX, dist[4][N], dp[N], dp1[N], vis[N];
tuple<int, int, int> ed[N];
vector<pair<int, int>> g[N];
vector<int> dag[N], rv[N];
void dij(int st, int id){
for(int i = 0;i<N;i++) dist[id][i] = LLONG_MAX;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
dist[id][st] = 0;
pq.push({0, st});
while(!pq.empty()){
auto [d, u] = pq.top();
pq.pop();
if(d > dist[id][u]) continue;
for(auto [v, w] : g[u]){
if(d + w < dist[id][v]){
dist[id][v] = d + w;
pq.push({d + w, v});
}
}
}
}
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> n >> m >> s >> t >> ss >> tt;
for(int i = 0;i<m;i++){
auto &[u, v, w] = ed[i];
cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
}
dij(s, 0);
dij(t, 1);
dij(ss, 2);
dij(tt, 3);
// for(int i = 0;i<4;i++){
// for(int j = 1;j<=n;j++){
// cout << dist[i][j] << ' ';
// }
// cout << '\n';
// }
for(int i = 0;i<m;i++){
auto [u, v, w] = ed[i];
if(dist[0][u] + w + dist[1][v] == dist[0][t]){
dag[u].push_back(v);
rv[v].push_back(u);
}
if(dist[0][v] + w + dist[1][u] == dist[0][t]){
dag[v].push_back(u);
rv[u].push_back(v);
}
}
queue<int> q;
q.push(t);
while(!q.empty()){
auto u = q.front();
q.pop();
// cout << u << '\n';
dp[u] = LLONG_MAX;
dp1[u] = LLONG_MAX;
for(auto v : dag[u]){
dp[u] = min(dp[u], dp[v]);
dp1[u] = min(dp1[u], dp1[v]);
}
dp[u] = min(dp[u], dist[3][u]);
dp1[u] = min(dp1[u], dist[2][u]);
ans = min(ans, dist[2][u] + dp[u]);
ans = min(ans, dist[3][u] + dp1[u]);
for(auto v : rv[u]){
if(!vis[v]){
vis[v] = 1;
q.push(v);
}
}
}
cout << min(ans, dist[2][tt]);
}
| # | 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... |