제출 #1243853

#제출 시각아이디문제언어결과실행 시간메모리
1243853longggggCommuter Pass (JOI18_commuter_pass)C++20
15 / 100
2094 ms32428 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...