比赛 20161115 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 树和机器人 最终得分 100
用户昵称 KZNS 运行时间 0.305 s
代码语言 C++ 内存使用 1.02 MiB
提交时间 2016-11-15 11:27:40
显示代码纯文本
  1. //KZNS
  2. #include <cstdio>
  3. #include <vector>
  4. #include <utility>
  5. #include <cstring>
  6. using namespace std;
  7. #define Nmax 50004
  8. #define Kmax 23
  9. typedef pair<int, int> pr;
  10. vector<pr> gp[Nmax];
  11. int N, R, K;
  12. void init() {
  13. scanf("%d %d %d", &N, &R, &K);
  14. int a, b, c;
  15. for (int i = 1; i < N; i++) {
  16. scanf("%d %d %d", &a, &b, &c);
  17. gp[a].push_back(make_pair(b, c));
  18. gp[b].push_back(make_pair(a, c));
  19. }
  20. }
  21. int fa[Nmax];
  22. void DFS(int x, int *F) {
  23. int v;
  24. int mn;
  25. int G[Kmax];
  26. for (int i = 0; i < gp[x].size(); i++) {
  27. if (fa[x] == gp[x][i].first)
  28. continue;
  29. memset(G, 0, sizeof(G));
  30. fa[gp[x][i].first] = x;
  31. DFS(gp[x][i].first, G);
  32. v = gp[x][i].second;
  33. for (int k = K; k >= 0; k--) {
  34. mn = F[k] + G[0] + v*2;
  35. for (int g = 1; g <= k; g++)
  36. mn = min(mn, F[k-g] + G[g] + g * v);
  37. F[k] = mn;
  38. }
  39. //for (int k = 1; k <= K; k++)
  40. // F[k] = min(F[k], F[k-1]);
  41. }
  42. }
  43. int main() {
  44. freopen("trobot.in", "r", stdin);
  45. freopen("trobot.out", "w", stdout);
  46. init();
  47. int F[Kmax] = {0};
  48. DFS(R, F);
  49. printf("%d\n", F[K]);
  50. return 0;
  51. }
  52. //UBWH
  53.