Submission #1350478

#TimeUsernameProblemLanguageResultExecution timeMemory
1350478SulARoad Closures (APIO21_roads)C++20
0 / 100
105 ms10736 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 2000;
vector<pair<int,int>> adj[N];
long long dp[N][N];

void dfs(int u, int p = -1) {
    for (auto [v, w] : adj[u]) if (v != p) {
        dfs(v, u);
    }
    for (auto [v, w] : adj[u]) if (v != p) {
        dp[0][u] += w + dp[0][v];
    }
    for (int k = 1; k < N; k++) {
        vector<long long> difs;
        for (auto [v, w] : adj[u]) if (v != p) {
            dp[k][u] += w + dp[k][v];
            difs.emplace_back(dp[k-1][v] - (w + dp[k][v]));
        }
        ranges::sort(difs);
        for (int i = 0; i < k && i < difs.size(); i++) {
            dp[k][u] = min(dp[k][u], dp[k][u] + difs[i]);
        }
    }
//    for (int k = 0; k < 1; k++)
//        cout << u << " " << k << " " << dp[k][u] << "\n";
}

vector<long long> minimum_closure_costs(int n, vector<int> u, vector<int> v, vector<int> w) {
    for (int i = 0; i < n-1; i++) {
        adj[u[i]].emplace_back(v[i], w[i]);
        adj[v[i]].emplace_back(u[i], w[i]);
    }
    dfs(0);
    vector<long long> ans(n);
    for (int i = 0; i < n; i++)
        ans[i] = dp[i][0];
    return ans;
}
#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...