Submission #1223651

#TimeUsernameProblemLanguageResultExecution timeMemory
1223651JerRoad Closures (APIO21_roads)C++20
0 / 100
17 ms3140 KiB
#include "roads.h"
#include <bits/stdc++.h>
#include <vector>

using namespace std;

typedef long long ll;

const int MAXN = 205;
int n;
ll total = 0;
ll dp[MAXN][MAXN];

#define w(i) i.first
#define u(i) i.second

vector<pair<int, int>> con[MAXN];

ll solve(int curr, int par, int k){
	if (k < 0)
		return -LONG_LONG_MAX;

	if (dp[curr][k] != -1)
		return dp[curr][k];

	vector<pair<ll, int>> best, out, dif;

	int j = 0;
	for (auto i : con[curr]){
		if (u(i) == par)
			continue;
		
		best.push_back({solve(u(i), curr, k - 1) + w(i), j});
		j++;
	}
	
	j = 0;
	for (auto i : con[curr]){
		if (u(i) == par)
			continue;
		
		out.push_back({solve(u(i), curr, k), j});
		j++;
	}

	for (int i = 0; i < best.size(); i++)
		dif.push_back({best[i].first - out[i].first, i});
	
	ll res = 0;
	vector<bool> used (best.size(), false);

	sort(dif.begin(), dif.end(), greater<pair<ll, int>>());

	for (int i = 0; i < k and i < best.size(); i++)
		if (dif[i].first > 0)
			used[dif[i].second] = true, res += best[dif[i].second].first;

	for (int i = 0; i < con[curr].size() -1; i++)
	{
		if (!used[i])
			res += out[i].first;
	}
	
	dp[curr][k] = res;
	return res;
}

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++)
		con[U[i]].push_back({W[i], V[i]}), con[V[i]].push_back({W[i], U[i]}), total += W[i];
	
	vector<ll> res;

	for (int k = 0; k < n; k++){
		for (int i = 0; i < n; i++)
			for (int j = 0; j < n; j++)
				dp[i][j] = -1;

		res.push_back(total - solve(0, -1, k));
	}
	
	return res;
}
#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...