-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathP4362.cc
50 lines (45 loc) · 1.4 KB
/
P4362.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
using namespace std;
struct AdjNode {
int v;
int weight;
AdjNode(int v, int weight) : v(v), weight(weight) {}
};
int m, k;
#define N 305
vector<AdjNode> tree[N];
int dp[N][N][2], tmp[N][2];
inline int min(int a, int b) { return a < b ? a : b; }
inline int min3(int a, int b, int c) { return min(a, min(b, c)); }
void dfs(int v, int fa) {
dp[v][0][0] = dp[v][1][1] = 0;
for (auto it = tree[v].begin(); it != tree[v].end(); it++) {
int w = it->v, weight = it->weight;
if (w == fa) continue;
dfs(w, v);
memcpy(tmp, dp[v], sizeof(tmp));
memset(dp[v], 0x3f, sizeof(dp[v]));
for (int j = 0; j <= k; j++)
for (int t = 0; t <= j; t++) {
dp[v][j][0] = min3(dp[v][j][0], dp[w][t][0] + tmp[j - t][0] + (m == 2) * weight, dp[w][t][1] + tmp[j - t][0]);
dp[v][j][1] = min3(dp[v][j][1], dp[w][t][1] + tmp[j - t][1] + weight, dp[w][t][0] + tmp[j - t][1]);
}
}
}
int main() {
int n, a, b, c;
scanf("%d %d %d", &n, &m, &k);
for (int i = 1; i < n; i++) {
scanf("%d %d %d", &a, &b, &c);
tree[a].push_back(AdjNode(b, c));
tree[b].push_back(AdjNode(a, c));
}
if (n - k < m - 1) { printf("-1"); exit(0); }
memset(dp, 0x3f, sizeof(dp));
dfs(1, 1);
printf("%d", dp[1][k][1]);
exit(0);
}