二分+dfs
每次二分判断在树上dfs当前mid能到的点数是否小于y
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=20010,M=2*N;
int e[M],ne[M],h[N],idx,w[M];
void add(int a,int b,int c)
{
e[idx]=b,ne[idx]=h[a],w[idx]=c,h[a]=idx++;
}
int dfs(int fa,int u,int x)
{
int cnt=1;
for(int i=h[u];~i;i=ne[i])
{
int j=e[i];
if(j==fa)continue;
if(w[i]>=x)cnt+=dfs(u,j,x);
}
return cnt;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
int n,y;
cin>>n>>y;
memset(h,-1,sizeof h);
idx=0;
for(int i=0;i<n-1;i++)
{
int a,b,c;
cin>>a>>b>>c;
add(a,b,c),add(b,a,c);
}
int l=-1,r=1e7;
while(l+1!=r)
{
int mid=l+r>>1;
if(dfs(-1,0,mid)<=y)r=mid;
else l=mid;
}
cout<<r<<endl;
}
return 0;
}