#include <bits/stdc++.h>
using namespace std;
const long long INF = 1e18;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int n, m, s, t, u, v;
cin >> n >> m >> s >> t >> u >> v;
s--, t--, u--, v--;
vector<vector<pair<int, long long>>> adj(n);
for (int i = 0; i < m; i++){
int a, b;
long long c;
cin >> a >> b >> c;
a--, b--;
adj[a].push_back({b, c});
adj[b].push_back({a, c});
}
auto dijkstra1 = [&](int start) -> vector<long long> {
vector<bool> processed(n, false);
vector<long long> dist(n, INF);
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier;
dist[start] = 0;
frontier.push({0, start});
while (!frontier.empty()){
int curr = frontier.top().second;
frontier.pop();
if (processed[curr]) continue;
processed[curr] = true;
for (const pair<int, long long> &edge : adj[curr]){
int node = edge.first;
long long cost = edge.second;
if (dist[node] > dist[curr] + cost){
dist[node] = dist[curr] + cost;
frontier.push({dist[node], node});
}
}
}
return dist;
};
vector<long long> dpU = dijkstra1(u);
vector<long long> dpV = dijkstra1(v);
auto dijkstra2 = [&](int start, int end) -> long long {
vector<long long> dist(n, INF);
vector<vector<long long>> dp(2, vector<long long>(n, INF));
priority_queue<pair<long long, int>, vector<pair<long long, int>>, greater<pair<long long, int>>> frontier;
dist[start] = 0;
frontier.push({0, start});
while (!frontier.empty()){
int curr = frontier.top().second;
long long curr_dist = frontier.top().first;
frontier.pop();
if (curr_dist != dist[curr]) continue;
for (const pair<int, long long> &edge : adj[curr]){
int node = edge.first;
long long cost = edge.second;
if (dist[node] > dist[curr] + cost){
dp[0][node] = min(dpU[node], dp[0][curr]);
dp[1][node] = min(dpV[node], dp[1][curr]);
dist[node] = dist[curr] + cost;
frontier.push({dist[node], node});
}
else if (dist[node] == dist[curr] + cost && min(dpU[node], dp[0][curr]) + min(dpV[node], dp[1][curr]) <= dp[0][node] + dp[1][node]){
dp[0][node] = min(dpU[node], dp[0][curr]);
dp[1][node] = min(dpV[node], dp[1][curr]);
}
}
}
return dp[0][end] + dp[1][end];
};
cout << min({dpU[v], dijkstra2(s, t), dijkstra2(t, s)}) << "\n";
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... |