以1号点为根树形dp,
dp[x]=对每个儿子sum+=min(w(边权),dp[那个儿子]),dp=sum;这个地方要对limit power进行判断。
对于没有解的情况,我是用inf作为标记物表示这个点无法被切断,枚举儿子 如果有个儿子dp[..]=inf并且w>limit power 那么就设置父节点dp[x]=inf 并且return
最后对dp[1]>=m作判断即可(已包括dp[1]==inf的情况).
#include<cstdio>
#include<cstring>
#include<vector>
const int inf=1<<30;
using namespace std;
int n,m,dp[1001],flag=0;
struct node
{
int y,w;
};
vector<node>vt[1001];
void dfs(int x,int fa,int va)
{
int sum=0;
//printf("%d\n",x);
if(vt[x].size()==1&&vt[x][0].y==fa)
{
dp[x]=inf;
return;
}
for(int i=0;i<vt[x].size();i++)
{
int y=vt[x][i].y,w=vt[x][i].w;
if(fa==y)
continue;
dfs(y,x,va);
int tp;
if(w>va&&dp[y]==inf)
{
dp[x]=inf;
return;
}
if(w>va)
tp=dp[y];
else
if(dp[y]==inf)
tp=w;
else
tp=min(dp[y],w);
sum+=tp;
}
dp[x]=sum;
}
int gao(int va)
{
memset(dp,0,sizeof(dp));
flag=0;
dfs(1,0,va);
if(dp[1]>m)
flag=1;
return flag;
}
int main()
{
while(scanf("%d%d",&n,&m),n||m)
{
int mx=0;
for(int i=1;i<=n;i++)
vt[i].clear();
for(int i=1;i<=n-1;i++)
{
int a,b,w;
scanf("%d%d%d",&a,&b,&w);
node s;
s.y=b,s.w=w;
vt[a].push_back(s);
s.y=a;
vt[b].push_back(s);
mx=max(mx,w);
}
int l=1,r=mx;
while(l<r)
{
int m=(l+r)>>1;
if(gao(m))
l=m+1;
else
r=m;
}
if(gao(r))
printf("-1\n");
else
printf("%d\n",r);
}
}