这是七十五分
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define S 1000005
using namespace std;
//分治函数
int f[S];
struct mmm{
int ne,to,dis;
}e[S*2];
int h[S],cnt1;
int cnt;
void add(int u,int v,int val){
e[++cnt1].ne=h[u];
e[cnt1].to=v;
e[cnt1].dis=val;
h[u]=cnt1;
}
struct nnn{
int d,bian;
}re[S];
int siz[S],rt;
int use[S];
int ANS,Size;
void get_root(int u,int fa){
f[u]=0;siz[u]=1;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v]||v==fa)continue;
get_root(v,u);
f[u]=max(f[u],siz[v]);
siz[u]+=siz[v];
}
f[u]=max(f[u],Size-siz[u]);
if(f[u]<f[rt])rt=u;
}
int b[S];
void get_num(int u,int fa,int D,int el,int from){
b[cnt]=from;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(v==fa||use[v])continue;
re[++cnt].d=D+e[i].dis;
re[cnt].bian=el+1;
get_num(v,u,re[cnt].d,re[cnt].bian,from);
}
}
bool cmp(nnn &a,nnn &b){
if(a.d!=b.d)return a.d<b.d;
return a.bian<b.bian;
}
int n,k;
void solve(int u,int D){
cnt=1;
re[cnt].d=D;
b[1]=u;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v])continue;
b[++cnt]=v;
re[++cnt].d=D+e[i].dis;
re[cnt].bian=1;
get_num(v,u,re[cnt].d,re[cnt].bian,v);
}
sort(re+1,re+1+cnt,cmp);
int l=1,ll=cnt;
while(l<cnt&&re[l].d+re[cnt].d<k)l++;
while(l<cnt&&k-re[l].d>=re[l].d){
if(ll<l)ll=l;
while(re[l].d+re[ll].d>k&&l+1<=ll)ll--;
while(re[l].d+re[ll].d>=k&&l+1<=ll){
//cout<<b[ll]<<" "<<b[l]<<l<<" "<<ll<<endl;
ANS=min(ANS,re[l].bian+re[ll].bian);
//ANS=min(ANS,re[l].bian);
ll--;
}
l++;
}
}
void dfs(int u){
use[u]=1;
solve(u,0);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v])continue;
Size=siz[v];
rt=0;
get_root(v,u);
dfs(rt);
}
}
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int aaa,bbb,ccc;
int main(){
f[0]=0x3f3f3f;ANS=0x3f3f3f;
n=read();k=read();
Size=n;
for(int i=1;i<n;++i){
aaa=read()+1;bbb=read()+1;ccc=read();
add(aaa,bbb,ccc);
add(bbb,aaa,ccc);
}
get_root(1,0);
dfs(rt);
if(ANS==0x3f3f3f)printf("-1\n");
else printf("%d\n",ANS);
return 0;
}
这是七十分
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define S 1000005
using namespace std;
//分治函数
int f[S];
struct mmm{
int ne,to,dis;
}e[S*2];
int h[S],cnt1;
int cnt;
void add(int u,int v,int val){
e[++cnt1].ne=h[u];
e[cnt1].to=v;
e[cnt1].dis=val;
h[u]=cnt1;
}
struct nnn{
int d,bian;
}re[S];
int siz[S],rt;
int use[S];
int ANS,Size;
void get_root(int u,int fa){
f[u]=0;siz[u]=1;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v]||v==fa)continue;
get_root(v,u);
f[u]=max(f[u],siz[v]);
siz[u]+=siz[v];
}
f[u]=max(f[u],Size-siz[u]);
if(f[u]<f[rt])rt=u;
}
int b[S];
void get_num(int u,int fa,int D,int el,int from){
b[cnt]=from;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(v==fa||use[v])continue;
re[++cnt].d=D+e[i].dis;
re[cnt].bian=el+1;
get_num(v,u,re[cnt].d,re[cnt].bian,from);
}
}
bool cmp(nnn &a,nnn &b){
return a.d<b.d;
}
int n,k;
void solve(int u,int D){
cnt=1;
re[cnt].d=D;
b[1]=u;
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v])continue;
b[++cnt]=v;
re[++cnt].d=D+e[i].dis;
re[cnt].bian=1;
get_num(v,u,re[cnt].d,re[cnt].bian,v);
}
sort(re+1,re+1+cnt,cmp);
int l=1,ll=cnt-1,rr=cnt;
while(l<cnt&&re[l].d+re[cnt].d<k)++l;
while(l<cnt&&k-re[l].d>=re[l].d){
if(ll<=l)ll=l;
while(re[l].d+re[ll].d>k&&l+1<=ll)ll--;
while(re[l].d+re[ll].d>=k&&l+1<=ll){
//cout<<b[ll]<<" "<<b[l]<<l<<" "<<ll<<endl;
ANS=min(ANS,re[l].bian+re[ll].bian);
ll--;
}
while(re[l].d+re[rr].d>k&&ll<rr)rr--;
l++;
}
}
void dfs(int u){
use[u]=1;
solve(u,0);
for(int i=h[u];i;i=e[i].ne){
int v=e[i].to;
if(use[v])continue;
Size=siz[v];
rt=0;
get_root(v,u);
dfs(rt);
}
}
inline int read(){
int x=0;char ch=getchar();
while(ch<'0'||ch>'9'){ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x;
}
int aaa,bbb,ccc;
int main(){
f[0]=0x3f3f3f;ANS=0x3f3f3f;
n=read();k=read();
Size=n;
for(int i=1;i<n;++i){
aaa=read()+1;bbb=read()+1;ccc=read();
add(aaa,bbb,ccc);
add(bbb,aaa,ccc);
}
get_root(1,0);
dfs(rt);
if(ANS==0x3f3f3f)printf("-1\n");
else printf("%d\n",ANS);
return 0;
}