#include "bits/stdc++.h"
using namespace std;
#define task ""
#define ll long long
#define endl '\n'
#define fi first
#define se second
#define vall(a) (a).begin(), (a).end()
#define sze(a) (int)a.size()
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ep emplace_back
#define pb push_back
#define pf push_front
const ll mod = 1e9 + 7;
const int N = 1e6 + 5;
const ll oo = 1e18;
bool START;
int n, m, S, T, U, V;
ll dist[N][2], d[N], dp[N][2];
vector<pll> adj[N];
void dijkstra(int s, bool t) {
priority_queue<pll, vector<pll>, greater<pll>> q;
for (int i = 1; i <= n; ++i) dist[i][t] = oo;
dist[s][t] = 0;
q.push(make_pair(dist[s][t], s));
while(!q.empty()) {
auto[c, u] = q.top();
q.pop();
if (c != dist[u][t]) continue;
for (auto[v, w] : adj[u]) {
if (dist[v][t] > dist[u][t] + w) {
dist[v][t] = dist[u][t] + w;
q.push(make_pair(dist[v][t], v));
}
}
}
}
int par[N];
void dijk(int s) {
priority_queue<pll, vector<pll>, greater<pll>> q;
for (int i = 1; i <= n; ++i) {
d[i] = dp[i][0] = dp[i][1] = oo;
par[i] = 0;
}
d[s] = 0;
q.push(make_pair(d[s], s));
dp[s][0] = dist[s][0];
dp[s][1] = dist[s][1];
while(!q.empty()) {
auto[c, u] = q.top();
q.pop();
if (c != d[u]) continue;
for (auto[v, w] : adj[u]) {
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
q.push(make_pair(d[v], v));
par[v] = u;
dp[v][0] = min(dp[par[v]][0], dist[v][0]);
dp[v][1] = min(dp[par[v]][1], dist[v][1]);
}
else if (d[v] == d[u] + w) {
if (min(dist[v][0], dp[u][0]) + min(dist[v][1], dp[u][1]) <= dp[v][0] + dp[v][1]) {
dp[v][0] = min(dist[v][0], dp[u][0]);
dp[v][1] = min(dist[v][1], dp[u][1]);
par[v] = u;
}
}
}
}
}
inline void solve() {
dijkstra(U, 0);
dijkstra(V, 1);
ll ans = dist[V][0];
dijk(S);
ans = min(ans, dp[T][0] + dp[T][1]);
dijk(T);
ans = min(ans, dp[S][0] + dp[S][1]);
cout << ans;
}
inline void input() {
cin >> n >> m >> S >> T >> U >> V;
for (int i = 1; i <= m; ++i) {
int u, v, c;
cin >> u >> v >> c;
adj[u].pb(make_pair(v, c));
adj[v].pb(make_pair(u, c));
}
return solve();
}
bool END;
int main() {
if(fopen(task ".inp", "r")) {
freopen(task ".inp", "r", stdin);
freopen(task ".out", "w", stdout);
}
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
input();
cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << 's' << endl;
cerr << "Memory: " << fabs ((&END - &START)) / 1048576.0 << "MB\n";
return 0;
}
Compilation message (stderr)
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:115:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
115 | freopen(task ".inp", "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
commuter_pass.cpp:116:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
116 | freopen(task ".out", "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |