http://acm.timus.ru/problem.aspx?space=1&num=1018
类型:树dp
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 }