Submission #1209280

#TimeUsernameProblemLanguageResultExecution timeMemory
1209280vijay30046Museum (CEOI17_museum)C++17
100 / 100
360 ms310408 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

using ll = long long;
using vi = vector<int>;
#define all(x) x.begin(), x.end()
#define pb push_back
#define pii pair<int,int>
#define vii vector<pair<int,int>>
#define MOD 1000000007
// #define INF 1e9
#define FOR(i,a,b) for(int i=(a); i<(b); i++)
#define trav(a,x) for (auto& a: x)

#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("O2")
#pragma GCC optimization ("unroll-loops")

void start() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
}

const int N = 10001;
const int INF = 1e15;
vector<pair<int, int>> g[N];
vector<int> dp[N][2];
int n, k, x;

void process(int node, int par) {
	dp[node][0] = {INF, 0};
	dp[node][1] = {INF, 0};
	for (pair<int, int> edge : g[node]) {
		int child = edge.first;
		int len = edge.second;
		if (child == par)continue;
		process(child, node);
		int a = (int)dp[node][0].size();
		int b = (int)dp[child][0].size();
		vector<int> combined(a + b - 1, INF);
		for (int i = 1; i < a; i++) {
			combined[i] = dp[node][1][i];
		}
		for (int i = 1; i < a; i++) {
			for (int j = 1; j < b; j++) {
				combined[i + j] = min(combined[i + j], dp[node][1][i] + dp[child][0][j] + 2 * len);
				combined[i + j] = min(combined[i + j], dp[node][0][i] + dp[child][1][j] + len);
			}
		}
		dp[node][1] = combined;
		combined.assign(a + b - 1, INF);
		for (int i = 1; i < a; i++) {
			combined[i] = dp[node][0][i];
		}
		for (int i = 1; i < a; i++) {
			for (int j = 1; j < b; j++) {
				combined[i + j] = min(combined[i + j], dp[node][0][i] + dp[child][0][j] + 2 * len);
			}
		}
		dp[node][0] = combined;
	}
}

void solve() {
	cin >> n >> k >> x;
	for (int i = 1; i < n; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		g[a].pb({b, c});
		g[b].pb({a, c});
	}
	process(x, 0);
	int ans = dp[x][1][k];
	cout << ans << "\n";
}

int32_t main() {
	start();
	int test = 1;
	//cin >> test;
	for (int i = 1; i <= test; i++) {
		//cout << "Case #" << i << ": ";
		solve();
	}
	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...