#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf = 1e18;
const int N = 1e5 + 1;
vector<vector<pair<int,int>>> g(N);
int n, m, s, t, u, v;
vector<ll> dijkstra(int src) {
vector<ll> dist(n + 1, inf);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
pq.push({0, src});
dist[src] = 0;
while (!pq.empty()){
auto [w, a] = pq.top(); pq.pop();
for(auto [b, c] : g[a]){
if(dist[b] > w + c){
dist[b] = w + c;
pq.push({dist[b], b});
}
}
}
return dist;
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> s >> t >> u >> v;
for(int i = 1; i <= m; i++){
int a, b, c; cin >> a >> b >> c;
g[a].push_back({b, c});
g[b].push_back({a, c});
}
vector<ll> distS = dijkstra(s);
vector<ll> distT = dijkstra(t);
vector<ll> distU = dijkstra(u);
vector<ll> distV = dijkstra(v);
vector<int> order(n);
for (int i = 0; i < n; i++) order[i] = i + 1;
sort(order.begin(), order.end(), [&](int a, int b) {
return distS[a] < distS[b];
});
vector<ll> mnU(n + 1, inf), mnV(n + 1, inf);
mnU[s] = distU[s], mnV[s] = distV[s];
ll ans = min(distU[v], mnU[s] + mnV[s]);
for (auto a : order) {
for (auto [b, c] : g[a]) {
if (distS[a] + c + distT[b] == distS[t]) {
mnU[b] = min(distU[b], mnU[a]);
mnV[b] = min(distV[b], mnV[a]);
ans = min(ans, mnU[b] + mnV[b]);
}
}
}
cout << ans << "\n";
}
| # | 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... |