#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void DBG() { cerr << "]" << endl; }
template<class H, class... T> void DBG(H h, T... t) { cerr << to_string(h); if(sizeof...(t)) cerr << ", "; DBG(t...); }
#define dbg(...) cerr << "[" << #__VA_ARGS__ << "]: [", DBG(__VA_ARGS__)
const int N = 1e5 + 3;
const ll inf = 1e18;
vector<pair<int, int>> adj[N];
bool vis[N];
int n;
ll dis[N][3], dp[N][2], ans = inf;
void Dijkstra(int tp, int u) {
for (int i = 1; i <= n; i++) dis[i][tp] = inf;
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
pq.emplace(0, u);
dis[u][tp] = 0;
while (!pq.empty()) {
auto [w, c] = pq.top(); pq.pop();
if (w > dis[c][tp]) continue;
//dbg(dis[c][tp], c, tp, u);
for (auto [v, ww] : adj[c]) {
if (dis[v][tp] <= w+ww) continue;
dis[v][tp] = w+ww;
pq.emplace(dis[v][tp], v);
}
}
}
void dfs(int u) {
if (vis[u]) return;
vis[u] = true;
dp[u][0] = dis[u][1];
dp[u][1] = dis[u][2];
for (auto [x, w] : adj[u]) {
if (dis[x][0]+w != dis[u][0]) continue;
dfs(x);
dp[u][0] = min(dp[u][0], dp[x][0]);
dp[u][1] = min(dp[u][1], dp[x][1]);
}
ans = min(ans, dp[u][0] + dis[u][2]);
ans = min(ans, dp[u][1] + dis[u][1]);
}
void solve() {
int m; cin >> n >> m;
int s, t; cin >> s >> t;
int u, v; cin >> u >> v;
for (int i = 0; i < m; i++) {
int u, v, c; cin >> u >> v >> c;
adj[u].push_back({v, c});
adj[v].push_back({u, c});
}
Dijkstra(0, s);
Dijkstra(1, u);
Dijkstra(2, v);
ans = dis[u][2];
dfs(t);
cout << ans << "\n";
}
signed main() {
ios::sync_with_stdio(false); cin.tie(0);
int t=1; //cin >> t;
while (t--) {
solve();
}
}
# | 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... |