http://acm.timus.ru/problem.aspx?space=1&num=1018

类型:树dp

AC Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 int a[105][105],val[105]={0},tree[105][3],f[105][105],n;
 6 void buildtree(int root)
 7 {
 8     int lr=0;
 9     for(int i=1;i<=n;i++)
10     if(a[root][i]>0){
11         if(lr==2)
12         return;
13         lr++;
14         tree[root][lr]=i;
15         val[i]=a[root][i];
16         a[i][root]=-1;
17         buildtree(i);
18     }
19 }
20 void dfs(int root,int num)
21 {
22     if(num==0){
23         f[root][num]=0;
24         return;
25     }
26     else if(tree[root][1]==0&&tree[root][2]==0){
27         f[root][num]=val[root];
28         return;
29     }
30     else{
31         for(int i=0;i<num;i++){
32             if(f[tree[root][1]][i]==0)dfs(tree[root][1],i);
33             if(f[tree[root][2]][num-1-i]==0)dfs(tree[root][2],num-1-i);
34             f[root][num]=max(f[root][num],f[tree[root][1]][i]+f[tree[root][2]][num-1-i]+val[root]);
35             //if(root==1&&num==3)
36             //printf("f=%d\n",f[1][3]);
37         }
38     }
39 }
40 void print()
41 {
42     for(int i=1;i<6;i++)
43     printf("%d %d \n",tree[i][1],tree[i][2]);
44     printf("\n");
45     for(int i=1;i<6;i++)
46     printf("%d\n",val[i]);
47     printf("\n");
48 }
49 int main()
50 {
51     int m;
52     scanf("%d%d",&n,&m);
53     memset(a,0,sizeof(a));
54     memset(val,0,sizeof(val));
55     memset(f,0,sizeof(f));
56     memset(tree,0,sizeof(tree));
57     for(int i=1;i<n;i++){
58         int xx,yy,val;
59         scanf("%d%d%d",&xx,&yy,&val);
60         a[xx][yy]=val;
61         a[yy][xx]=val;
62     }
63     buildtree(1);
64     //print();
65     dfs(1,m+1);
66     printf("%d\n",f[1][m+1]);
67     return 0;
68 }