#include <bits/stdc++.h>
using namespace std;
// ===== BITWISE ===== //
#define MASK(i) (1LL << (i))
#define BIT(x, i) (1LL & ((x) >> (i)))
#define ON(x, i) ((x) | MASK(i))
#define OFF(x, i) ((x) & ~MASK(i))
#define LASTBIT(mask) ((mask) & -(mask))
// ===== OTHER ===== //
#define Longgggg ios_base::sync_with_stdio(0); cin.tie(0);
#define FOR(i, a, b) for (int i = (a); i <= (b); i++)
#define FORD(i, a, b) for (int i = (a); i >= (b); i--)
#define mod(x, k) ((((x) % (k)) + (k)) % (k))
#define all(x) begin(x), end(x)
#define fi first
#define se second
#define ll long long
#define endl '\n'
// ===== FILE ===== //
#define IN "A.in"
#define OUT "A.out"
#define DEBUG "debug.out"
//==================//
const ll INF = 1e18;
const int mxN = 1e5 + 5;
int N, M, S, T, U, V;
vector<pair<int, int>> adj[mxN];
vector<ll> dijkstra(int start, vector<pair<int, int>> g[]) {
vector<ll> dist(N + 1, INF);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
dist[start] = 0;
pq.emplace(0, start);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto &[v, cost] : g[u]) {
if (dist[v] > dist[u] + cost) {
dist[v] = dist[u] + cost;
pq.emplace(dist[v], v);
}
}
}
return dist;
}
ll run_with_commuter_pass(set<pair<int, int>> &free_edges) {
vector<ll> dist(N + 1, INF);
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<>> pq;
dist[U] = 0;
pq.emplace(0, U);
while (!pq.empty()) {
auto [d, u] = pq.top(); pq.pop();
if (d > dist[u]) continue;
for (auto &[v, w] : adj[u]) {
int cost = free_edges.count({u, v}) ? 0 : w;
if (dist[v] > dist[u] + cost) {
dist[v] = dist[u] + cost;
pq.emplace(dist[v], v);
}
}
}
return dist[V];
}
void solve() {
cin >> N >> M;
cin >> S >> T;
cin >> U >> V;
vector<tuple<int, int, int>> edgeList;
FOR(i, 1, M) {
int a, b, c;
cin >> a >> b >> c;
adj[a].emplace_back(b, c);
adj[b].emplace_back(a, c);
edgeList.emplace_back(a, b, c);
}
// Dijkstra từ S và T
auto distS = dijkstra(S, adj);
auto distT = dijkstra(T, adj);
ll shortest = distS[T];
// Xây đồ thị con chỉ gồm các cạnh nằm trên đường đi ngắn nhất
vector<vector<int>> sp_graph(mxN);
for (auto &[u, v, w] : edgeList) {
if (distS[u] + w + distT[v] == shortest)
sp_graph[u].push_back(v);
if (distS[v] + w + distT[u] == shortest)
sp_graph[v].push_back(u);
}
// Truy vết một số đường đi ngắn nhất từ S đến T (giới hạn số lượng)
const int LIMIT_PATHS = 500;
vector<vector<int>> paths;
vector<int> path;
function<void(int)> dfs = [&](int u) {
if ((int)paths.size() >= LIMIT_PATHS) return;
path.push_back(u);
if (u == T) {
paths.push_back(path);
path.pop_back();
return;
}
for (int v : sp_graph[u]) {
dfs(v);
}
path.pop_back();
};
dfs(S);
ll res = INF;
for (auto &p : paths) {
set<pair<int, int>> free;
for (int i = 0; i + 1 < (int)p.size(); i++) {
free.insert({p[i], p[i + 1]});
free.insert({p[i + 1], p[i]});
}
res = min(res, run_with_commuter_pass(free));
}
// So sánh với trường hợp không dùng commuter pass
auto distU = dijkstra(U, adj);
res = min(res, distU[V]);
cout << res << endl;
}
signed main() {
if (fopen(IN, "r")) {
freopen(IN, "r", stdin);
freopen(OUT, "w", stdout);
freopen(DEBUG, "w", stderr);
}
Longgggg
solve();
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
commuter_pass.cpp: In function 'int main()':
commuter_pass.cpp:136:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
136 | freopen(IN, "r", stdin);
| ~~~~~~~^~~~~~~~~~~~~~~~
commuter_pass.cpp:137:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
137 | freopen(OUT, "w", stdout);
| ~~~~~~~^~~~~~~~~~~~~~~~~~
commuter_pass.cpp:138:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
138 | freopen(DEBUG, "w", stderr);
| ~~~~~~~^~~~~~~~~~~~~~~~~~~~
# | 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... |