记录编号 557042 评测结果 AAAAAAAAAAAAA
题目名称 [Ural 1018] 二叉苹果树 最终得分 100
用户昵称 Gravatar夜莺 是否通过 通过
代码语言 C++ 运行时间 0.000 s
提交时间 2020-11-02 20:10:52 内存使用 0.00 MiB
显示代码纯文本
 #include<iostream>
 #include<iomanip>
 #include<cstring>
 #include<cstdio>
 #include<cmath>
 #include<memory>
 #include<algorithm>
 #include<string>
 #include<climits>
 #include<queue>
 #include<vector>
 #include<cstdlib>
 #include<map>
 using namespace std;
 
 const int ee=105;
 int n,q;
 int tree[ee][5]={0},ma[ee][ee]={0},num[ee]={0},f[ee][ee]={0};
 
 void preproccess()
 {
     for(int i=0;i<=n;i++)
         for(int j=0;j<=n;j++)
         {
             ma[i][j]=-1;
             ma[j][i]=-1;
         }
 }
 
 void maketree(int v);
 
 void build(int x,int y,int lor)//lor means left or right
 {
     num[y]=ma[x][y];
     tree[x][lor]=y;
     ma[x][y]=-1;ma[y][x]=-1;
     maketree(y);
 }
 
 void maketree(int v)
 {
     int lr=0;
     for(int i=0;i<=n;i++)
         if(ma[v][i]>=0)//如果分叉了,那么记录
         {
             lr++;//1 or 2 表示左支还是右支;
             build(v,i,lr);//存入并递归
             if(lr==2)    return;
         }
 }
 
 void dfs(int v,int k)
 {
     if(k==0)    f[v][k]=0;
     else if(tree[v][1]==0 && tree[v][2]==0) f[v][k]=num[v];
     else
     {
         f[v][k]=0;
         for(int i=0;i<k;i++)
         {
             if(f[tree[v][1]][i]==0)    dfs(tree[v][1],i);
             if(f[tree[v][2]][k-i-1]==0)    dfs(tree[v][2],k-i-1);
             f[v][k]=max(f[v][k],(f[tree[v][1]][i]+f[tree[v][2]][k-i-1]+num[v]));
         }
     }
 }   
 
 int main()
 {
     freopen("ecappletree.in","r",stdin);
	 freopen("ecappletree.out","w",stdout); 
     cin>>n>>q;
     preproccess();
     
     for(int i=0;i<n;i++)
     {
         int x,y,xy;
         scanf("%d%d%d",&x,&y,&xy);
         ma[x][y]=xy;
         ma[y][x]=xy;
     }
     
     //建树;
     maketree(1);
     
     dfs(1,q+1);
     
     cout<<f[1][q+1];
     
 return 0;
 }