Submission #1139463

#TimeUsernameProblemLanguageResultExecution timeMemory
1139463stefdascaMuseum (CEOI17_museum)C++20
100 / 100
628 ms592868 KiB
#include <iostream> #include <vector> using namespace std; int n, k, x; int dp[2][10002][10002]; int xtr[10002][10002]; vector<pair<int, int>> v[10002]; vector<int> dp2[2][10002]; vector<int> xtr2[2][10002]; vector<bool> viz2[2][10002]; int sts[10002]; void dfs(int parent, int node, int cost) { sts[node] = 1; for (int i = 0; i < (int) v[node].size(); ++i) { int vecin = v[node][i].first; if (vecin == parent) continue; dfs(node, vecin, v[node][i].second); sts[node] += sts[vecin]; } dp2[0][node].resize(sts[node] + 2, 0); dp2[1][node].resize(sts[node] + 2, 0); xtr2[0][node].resize(sts[node] + 2, 0); xtr2[1][node].resize(sts[node] + 2, 0); viz2[0][node].resize(sts[node] + 2, 0); viz2[1][node].resize(sts[node] + 2, 0); viz2[0][node][1] = 1; sts[node] = 1; for (int i = 0; i < (int) v[node].size(); ++i) { int vecin = v[node][i].first; if (vecin == parent) continue; int edcost = v[node][i].second; for (int j = min(k, sts[node]); j >= 1; --j) for (int sz = 1; sz <= min(sts[vecin], k - j); ++sz) { if (!viz2[1][node][j + sz] || dp2[0][node][j] + dp[1][vecin][sz] + edcost < dp2[1][node][j + sz]) { dp2[1][node][j + sz] = dp2[0][node][j] + dp[1][vecin][sz] + edcost; viz2[1][node][j + sz] = 1; xtr2[1][node][j + sz] = xtr[vecin][sz]; } else { if (dp2[0][node][j] + dp[1][vecin][sz] + edcost == dp2[1][node][j + sz]) { xtr2[1][node][j + sz] = min(xtr2[1][node][j + sz], xtr[vecin][sz]); } } for (int trb = 0; trb <= 1; ++trb) { if (!viz2[trb][node][j + sz] || dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost < dp2[trb][node][j + sz]) { dp2[trb][node][j + sz] = dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost; viz2[trb][node][j + sz] = 1; xtr2[trb][node][j + sz] = xtr2[trb][node][j]; } else if (dp2[trb][node][j] + dp[0][vecin][sz] + 2 * edcost == dp2[trb][node][j + sz]) { xtr2[trb][node][j + sz] = min(xtr2[trb][node][j + sz], xtr2[trb][node][j]); } } } sts[node] += sts[vecin]; } for (int i = 2; i <= min(k, sts[node]); ++i) { dp[1][node][i] = dp2[1][node][i]; xtr[node][i] = xtr2[1][node][i]; dp[0][node][i] = dp2[0][node][i]; } for (int i = 1; i <= min(k, sts[node]); ++i) xtr[node][i] += cost; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n >> k >> x; for (int i = 1; i < n; ++i) { int a, b, c; cin >> a >> b >> c; v[a].push_back({b, c}); v[b].push_back({a, c}); } dfs(0, x, 0); cout << dp[1][x][k] << '\n'; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...