记录编号 446759 评测结果 AAAAAAAAAAAAA
题目名称 [Ural 1018] 二叉苹果树 最终得分 100
用户昵称 GravatarJustWB 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2017-09-08 20:50:32 内存使用 0.36 MiB
显示代码纯文本
  1. #include<cstdio>
  2. #include<iostream>
  3. const int maxn=105;
  4. using namespace std;
  5. struct edge
  6. {
  7. int fr,to,va;
  8. edge *nt;
  9. edge(){fr=to=va=0;nt=NULL;}
  10. }*e[maxn];
  11. inline int get();
  12. inline edge *add(int fr,int to,int va);
  13. int dfs(edge *now);
  14. int n,m;
  15. int a,b,c;
  16. int f[maxn][maxn];
  17. bool jud[maxn];
  18. int main()
  19. {
  20. freopen("ecappletree.in","r",stdin);
  21. freopen("ecappletree.out","w",stdout);
  22. n=get(),m=get();
  23. for(int i=1;i<n;i++)
  24. {
  25. a=get(),b=get(),c=get();
  26. e[a]=add(a,b,c);
  27. e[b]=add(b,a,c);
  28. }
  29. jud[1]=true;
  30. dfs(e[1]);
  31. printf("%d",f[1][m]);
  32. return 0;
  33. }
  34. int dfs(edge *now)
  35. {
  36. int siz=0,fr=now->fr;
  37. for(;now;now=now->nt)
  38. {
  39. if(jud[now->to])continue;
  40. jud[now->to]=true;
  41. siz+=dfs(e[now->to])+1;
  42. for(int i=min(m,siz);i>=1;i--)
  43. {
  44. for(int j=min(i,m);j>=1;j--)
  45. {
  46. f[fr][i]=max(f[fr][i],f[fr][i-j]+f[now->to][j-1]+now->va);
  47. }
  48. }
  49. }
  50. return siz;
  51. }
  52. inline edge *add(int fr,int to,int va)
  53. {
  54. edge *p=new edge();
  55. p->fr=fr;p->to=to;p->va=va;
  56. p->nt=e[fr];
  57. return p;
  58. }
  59. inline int get()
  60. {
  61. int t=0;char c=getchar(),j=1;
  62. while(!isdigit(c))
  63. {
  64. if(c=='-')j=-1;
  65. c=getchar();
  66. }
  67. while(isdigit(c))
  68. {
  69. t=(t<<3)+(t<<1)+c-'0';
  70. c=getchar();
  71. }
  72. return j*t;
  73. }