제출 #878715

#제출 시각아이디문제언어결과실행 시간메모리
878715The_SamuraiEvacuation plan (IZhO18_plan)C++17
22 / 100
4022 ms105704 KiB
#include <random> #include "bits/stdc++.h" using namespace std; using ll = long long; const int inf = 1e9; void solve() { int n, m, q; cin >> n >> m; vector<vector<pair<int, int>>> g(n + 1); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } vector<int> danger(n + 1, inf); { int k; cin >> k; priority_queue<pair<int, int>> pq; for (int i = 0; i < k; i++) { int root; cin >> root; pq.emplace(0, root); danger[root] = 0; } vector<bool> vis(n + 1); while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); d = -d; if (vis[u]) continue; vis[u] = true; for (auto [v, w]: g[u]) { if (danger[v] <= d + w) continue; danger[v] = d + w; pq.emplace(-danger[v], v); } } } const int sq = min(n, 200); vector<int> roots(n); iota(roots.begin(), roots.end(), 1); vector ans(sq, vector(n + 1, 0)); vector<bool> vis(n + 1); vector<int> all(n); { shuffle(roots.begin(), roots.end(), mt19937(random_device()())); while (roots.size() != sq) roots.pop_back(); priority_queue<pair<int, int>> pq; for (int i = 0; i < sq; i++) { int root = roots[i], z = 1; pq.emplace(danger[root], root); ans[i][root] = danger[root]; vis[root] = true; all[0] = root; while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); for (auto [v, w]: g[u]) { if (vis[v]) continue; ans[i][v] = min(d, danger[v]); vis[v] = true; all[z++] = v; pq.emplace(ans[i][v], v); } } for (int j = 0; j < z; j++) vis[all[j]] = false; } } cin >> q; while (q--) { int s, t, best = 0; cin >> s >> t; for (int i = 0; i < sq; i++) best = max(best, min(ans[i][s], ans[i][t])); priority_queue<pair<int, int>> pq; pq.emplace(danger[s], s); all[0] = s; vis[s] = true; int z = 1; while (!pq.empty()) { auto [d, u] = pq.top(); pq.pop(); bool found = false; for (auto [v, w]: g[u]) { if (z == sq) break; if (vis[v]) continue; if (v == t) { best = max(best, min(d, danger[v])); found = true; break; } pq.emplace(min(d, danger[v]), v); vis[v] = true; all[z++] = v; } if (found) break; } for (int j = 0; j < z; j++) vis[all[j]] = false; cout << best << '\n'; } } int main() { srand(time(0)); cin.tie(0)->sync_with_stdio(false); #ifdef sunnatov freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); #endif int queries = 1; // cin >> queries; for (int test_case = 1; test_case <= queries; test_case++) { #ifdef sunnatov cout << "Test case: " << test_case << endl; #endif solve(); cout << '\n'; } }

컴파일 시 표준 에러 (stderr) 메시지

plan.cpp: In function 'void solve()':
plan.cpp:51:29: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   51 |         while (roots.size() != sq) roots.pop_back();
      |                ~~~~~~~~~~~~~^~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...