77分 求救!!!!
查看原帖
77分 求救!!!!
94475
锦依卫小生楼主2020/10/18 23:30
#include<bits/stdc++.h>
using namespace std;
long long  n,q,head[10000],cnt,g[105][105][105],b[105][105][105],ans;
struct node{
	long long to,next,v;
};
node edge[10000];
void addedge(int x,int y,int z)
{
	cnt++;
	edge[cnt].to=y;
	edge[cnt].v=z;
	edge[cnt].next=head[x];
	head[x]=cnt;
}
long long dfs(int k,int fa,int l)
{
	if(b[k][fa][l]==1)
	  return g[k][fa][l];
	b[k][fa][l]=1;
	if(l>q)
	{
		g[k][fa][l]=-2e9;// 若添加该边超过边总数,就使答案为负无穷 
		return -2e9;
	}
	int p[4]={0},c=0;
	for(int i=head[k];i!=0;i=edge[i].next)
	  if(edge[i].to!=fa)
	   p[++c]=i;
	if(c==0)//对于结点k其要么无子结点 要么子节点为2 
	{
	   g[k][fa][l]=0;
	   return 0;
	}
    else
      if(c==2)//子节点为2,第一种情况2边都选,第二种去左子树,第三种去右子树 
	    g[k][fa][l]= max(max(edge[p[1]].v+edge[p[2]].v+dfs(edge[p[1]].to,k,l+2)+dfs(edge[p[2]].to,k,l+2),
	                         edge[p[1]].v+dfs(edge[p[1]].to,k,l+1)),
							 edge[p[2]].v+dfs(edge[p[2]].to,k,l+1));
	 
	return g[k][fa][l];
}
int main()
{
	cin>>n>>q;
	for(int i=1;i<=n-1;++i)
	{
	   int x,y,z;
	   scanf("%d%d%d",&x,&y,&z);
	   addedge(x,y,z);
	   addedge(y,x,z); 
	}
    
	 ans=max(ans,dfs(1,0,0)) ;
	cout<<ans;
 } 
 
2020/10/18 23:30
加载中...