제출 #1210734

#제출 시각아이디문제언어결과실행 시간메모리
1210734duckindogRoad Closures (APIO21_roads)C++17
24 / 100
2096 ms19684 KiB
#include "roads.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 100'000 + 10; const long long MAX = 1'000'000'000'000'000; int n; vector<pair<int, int>> ad[MAXN]; long long parW[MAXN]; int k; long long f[MAXN][2]; void dfs(int u, int p = -1) { for (const auto& [v, w] : ad[u]) { if (v == p) continue; parW[v] = w; dfs(v, u); } long long sum = 0; vector<long long> best; for (const auto& [v, w] : ad[u]) { if (v == p) continue; sum += min(f[v][0], f[v][1]); best.push_back(f[v][1] - min(f[v][0], f[v][1])); } sort(best.begin(), best.end()); int cnt = ad[u].size() - k; if (cnt <= (int)best.size()) { f[u][0] = sum + accumulate(best.begin(), best.begin() + max(0, cnt), 0ll); f[u][1] = sum + accumulate(best.begin(), best.begin() + max(0, cnt - 1), 0ll) + parW[u]; } else { f[u][0] = MAX; f[u][1] = sum + accumulate(best.begin(), best.end(), 0ll) + parW[u]; } } std::vector<long long> minimum_closure_costs(int N, std::vector<int> U, std::vector<int> V, std::vector<int> W) { n = N; for (int i = 0; i < n - 1; ++i) { int u = U[i], v = V[i], w = W[i]; ad[u].push_back({v, w}); ad[v].push_back({u, w}); } parW[0] = MAX; vector<long long> ret; for (k = 0; k < n; ++k) { for (int i = 0; i < n; ++i) f[i][0] = f[i][1] = MAX; dfs(0); ret.push_back(f[0][0]); } return ret; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...