#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = (ll)4e18;
struct Edge {
int to;
ll w;
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n, m;
cin >> n >> m;
int A, B, C, D;
cin >> A >> B >> C >> D;
vector<vector<Edge>> adj(n+1);
struct Raw{int u,v; ll w;};
vector<Raw> raw;
raw.reserve(m);
for(int i=0;i<m;i++){
int u,v;
ll w;
cin >> u >> v >> w;
adj[u].push_back({v,w});
adj[v].push_back({u,w});
raw.push_back({u,v,w});
}
// 1) Dijkstra từ A và B để tính d1[], d2[]
auto dijkstra = [&](int src){
vector<ll> d(n+1, INF);
d[src]=0;
priority_queue<pair<ll,int>, vector<pair<ll,int>>, greater<>> pq;
pq.push({0, src});
while(!pq.empty()){
auto [du,u] = pq.top(); pq.pop();
if(du>d[u]) continue;
for(auto &e: adj[u]){
int v=e.to; ll w=e.w;
if(d[v] > du + w){
d[v] = du + w;
pq.push({d[v], v});
}
}
}
return d;
};
auto d1 = dijkstra(A);
auto d2 = dijkstra(B);
ll L = d1[B];
// 2) Đánh dấu special-edge
vector<unordered_set<int>> special(n+1);
for(int u=1;u<=n;u++){
for(auto &e: adj[u]){
int v=e.to; ll w=e.w;
if(d1[u] + w + d2[v] == L){
special[u].insert(v);
}
}
}
// 3) Dijkstra trên đồ thị 3-state cho chiều C->D
// dist[u][s]: min cost tới (u, state s)
vector<array<ll,3>> dist(n+1);
for(int i=1;i<=n;i++) dist[i] = {INF,INF,INF};
dist[C][0] = 0;
// pq: (cost, u, state)
struct Node{ ll d; int u,s; };
struct Cmp{ bool operator()(Node const &a, Node const &b) const {
return a.d > b.d;
}};
priority_queue<Node, vector<Node>, Cmp> pq;
pq.push({0, C, 0});
while(!pq.empty()){
auto [du,u,s] = pq.top(); pq.pop();
if(du > dist[u][s]) continue;
for(auto &e: adj[u]){
int v=e.to; ll w=e.w;
if(s==0){
// chưa vào special
if(special[u].count(v)){
// bước vào đường A->B
if(dist[v][1] > du){
dist[v][1] = du;
pq.push({du, v, 1});
}
}
// đi thường
if(dist[v][0] > du + w){
dist[v][0] = du + w;
pq.push({du + w, v, 0});
}
}
else if(s==1){
// đang trên special-path
if(special[u].count(v)){
// tiếp tục special
if(dist[v][1] > du){
dist[v][1] = du;
pq.push({du, v, 1});
}
} else {
// rời special, sang state 2
if(dist[v][2] > du + w){
dist[v][2] = du + w;
pq.push({du + w, v, 2});
}
}
}
else {
// s==2: đã rời, chỉ đi thường
if(dist[v][2] > du + w){
dist[v][2] = du + w;
pq.push({du + w, v, 2});
}
}
}
}
ll ans = min({dist[D][0], dist[D][1], dist[D][2]});
if(ans >= INF/2) ans = -1; // hoặc tuỳ đề, INF nghĩa không tới được
cout << ans << "\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... |