제출 #1072884

#제출 시각아이디문제언어결과실행 시간메모리
1072884stdfloat도로 폐쇄 (APIO21_roads)C++17
24 / 100
2091 ms24920 KiB
#include <bits/stdc++.h>
#include "roads.h"
using namespace std;
 
using ll = long long;
 
#define ff  first
#define ss  second
#define pii pair<int, int>
 
vector<vector<ll>> dp;
 
vector<vector<pii>> E;
 
void dfs(int x, int k, bool f, int p = -1) {
    if (dp[x][f] == LLONG_MAX) dp[x][f] = 0;
    else return;
 
    vector<ll> v;
    for (auto [i, w] : E[x]) {
        if (i == p) {
            if (f == 1) dp[x][f] += w;
            continue;
        }
 
        dfs(i, k, 0, x);
        dfs(i, k, 1, x);
 
        dp[x][f] += dp[i][0];
        v.push_back(dp[i][1] - dp[i][0]);
    }
 
    sort(v.begin(), v.end());
 
    for (int i = 0; i < (int)E[x].size() - k - f || (i < (int)v.size() && v[i] < 0); i++) {
        dp[x][f] += v[i];
    }

    // cout << "x " << x << ' ' << f << ' ' << k << ' ' << dp[x][f] << endl; 
}
 
vector<ll> minimum_closure_costs(int n, vector<int> U, vector<int> V, vector<int> W) {
    E.assign(n, {});
 
    vector<ll> ans = {0};
    for (int i = 0; i < n - 1; i++) {
        ans[0] += W[i];
        E[U[i]].push_back({V[i], W[i]});
        E[V[i]].push_back({U[i], W[i]});
    }
 
    for (int i = 1; i < n; i++) {
        dp.assign(n, vector<ll>(2, LLONG_MAX));
        dfs(0, i, 0);
        ans.push_back(dp[0][0]);
        // cout << endl;
    }
 
    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...