#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
const ll INF = 1e18;
struct Edge {
int to; ll weight;
};
void dijkstra(int start, int n, vector<ll>& dist, const vector<vector<Edge>>& adj) {
dist.assign(n + 1, INF);
dist[start] = 0;
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[u]) continue;
for (auto& e : adj[u]) {
if (dist[u] + e.weight < dist[e.to]) {
dist[e.to] = dist[u] + e.weight;
pq.push({dist[e.to], e.to});
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n, m, s, t, u, v;
cin >> n >> m >> s >> t >> u >> v;
vector<vector<Edge>> adj(n + 1);
for (int i = 0; i < m; i++) {
int a, b; ll c;
cin >> a >> b >> c;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
vector<ll> distS, distT, distU, distV;
dijkstra(s, n, distS, adj);
dijkstra(t, n, distT, adj);
dijkstra(u, n, distU, adj);
dijkstra(v, n, distV, adj);
// S-T eng qisqa yo'l DAG-ini hosil qiluvchi tartib (Topological sort kabi)
vector<int> nodes;
for (int i = 1; i <= n; i++) nodes.push_back(i);
sort(nodes.begin(), nodes.end(), [&](int a, int b) {
return distS[a] < distS[b];
});
vector<ll> dpU(n + 1, INF), dpV(n + 1, INF);
ll ans = distU[v];
// Ikki yo'nalishda DP (S -> T va T -> S uchun)
auto solve_dp = [&]() {
for (int i : nodes) {
if (distS[i] + distT[i] == distS[t]) {
dpU[i] = distU[i];
dpV[i] = distV[i];
for (auto& e : adj[i]) {
if (distS[e.to] + e.weight + distT[i] == distS[t]) {
dpU[i] = min(dpU[i], dpU[e.to]);
dpV[i] = min(dpV[i], dpV[e.to]);
}
}
ans = min(ans, dpU[i] + distV[i]);
}
}
};
solve_dp(); // S dan T ga qarab
// T dan S ga qarab qayta hisoblash uchun
fill(dpU.begin(), dpU.end(), INF);
fill(dpV.begin(), dpV.end(), INF);
reverse(nodes.begin(), nodes.end());
// T dan S ga bo'lgan DP mantiqi ham xuddi shunday
// (Faqat yo'nalish o'zgaradi)
// ... (To'liq yechimda solve_dp ikki marta chaqiriladi)
cout << ans << 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... |