Submission #764865

#TimeUsernameProblemLanguageResultExecution timeMemory
764865The_SamuraiParkovi (COCI22_parkovi)C++17
20 / 110
113 ms31904 KiB
#include "bits/stdc++.h" using namespace std; using ll = long long; int n, k; vector<bool> vis; vector<vector<pair<int, int>>> g; vector<ll> dp; ll ans; int best_pos; void sol2_dfs1(int u, int p) { for (auto [v, w]: g[u]) { if (v == p) { continue; } sol2_dfs1(v, u); dp[u] = max(dp[u], dp[v] + w); } } void sol2_dfs2(int u, int p, ll val) { if (ans > max(dp[u], val)) { ans = max(dp[u], val); best_pos = u; } ll mx1 = val, mx2 = 0; for (auto [v, w]: g[u]) { if (v == p) { continue; } if (mx1 < dp[v] + w) { mx2 = mx1; mx1 = dp[v] + w; } else { mx2 = max(mx2, dp[v] + w); } } for (auto [v, w]: g[u]) { if (v == p) { continue; } if (dp[v] + w == mx1) { sol2_dfs2(v, u, mx2 + w); } else { sol2_dfs2(v, u, mx1 + w); } } } void solve() { cin >> n >> k; g.assign(n + 1, {}); for (int i = 1; i < n; i++) { int u, v, w; cin >> u >> v >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } if (k == 1) { dp.assign(n + 1, 0); ans = 1e18; sol2_dfs1(1, 0); sol2_dfs2(1, 0, 0); cout << ans << '\n' << best_pos; return; } if (n <= 20) { ans = 1e18; vector<int> built; for (int i = 0; i < (1 << n); i++) { if (__builtin_popcount(i) != k) { continue; } priority_queue<pair<ll, int>> pq; vector<int> now; for (int j = 0; j < n; j++) { if ((1 << j) & i) { pq.emplace(0, j + 1); now.emplace_back(j + 1); } } vis.assign(n + 1, false); ll close = 0; while (!pq.empty()) { auto [d1, u] = pq.top(); pq.pop(); if (vis[u]) { continue; } vis[u] = true; d1 = -d1; close = max(close, d1); for (auto [v, d2]: g[u]) { if (!vis[v]) { pq.emplace(-d1 - d2, v); } } } if (ans > close) { ans = close; built = now; } } cout << ans << '\n'; for (int x: built) { cout << x << ' '; } return; } } int main() { ios_base::sync_with_stdio(false); cout.tie(nullptr); cin.tie(nullptr); int queries = 1; #ifdef test_cases freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout); // cin >> queries; #else // cin >> queries; #endif for (int test_case = 1; test_case <= queries; test_case++) { solve(); // cout << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...