Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=200005;
- const int M=1000005;
- int n,m;
- int root,SIZE;
- int s[N];
- int siz[N];
- bool vis[N];
- int ecnt;
- int fir[N],nex[N<<1],to[N<<1],w[N<<1];
- inline void addedge(int u,int v,int c){
- nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
- nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
- }
- void getroot(int x,int f){
- siz[x]=1;
- s[x]=0;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- getroot(v,x);
- siz[x]+=siz[v];
- s[x]=max(s[x],siz[v]);
- }
- s[x]=max(s[x],SIZE-siz[x]);
- if(s[x]<s[root])root=x;
- }
- int F[M];
- int G[M];
- int CanF[N],totF;
- int CanG[N],totG;
- void getdist(int x,int f,int dist,int step){
- if(dist>m)return ;
- if(!F[dist]){
- CanF[++totF]=dist;
- F[dist]=step;
- }
- else if(step<F[dist])F[dist]=step;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- getdist(v,x,dist+w[i],step+1);
- }
- }
- int ans=1e9;
- void solve(int x,int size){
- vis[x]=1;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- getdist(v,x,w[i],1);
- if(F[m])
- ans=min(ans,F[m]);
- for(int i=1;i<=totF;++i){
- if(G[m-CanF[i]])
- ans=min(ans,G[m-CanF[i]]+F[CanF[i]]);
- }
- for(int i=1;i<=totF;++i){
- if(!G[CanF[i]]){
- CanG[++totG]=CanF[i];
- G[CanF[i]]=F[CanF[i]];
- }
- else if(F[CanF[i]]<G[CanF[i]])G[CanF[i]]=F[CanF[i]];
- }
- for(int i=1;i<=totF;++i){
- F[CanF[i]]=0;
- }
- totF=0;
- }
- for(int i=1;i<=totG;++i){
- G[CanG[i]]=0;
- }
- totG=0;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- s[root=0]=SIZE=(siz[x]<siz[v]?size-siz[x]:siz[v]);
- getroot(v,0);
- solve(root,SIZE);
- }
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- r(n),r(m);
- for(int i=1;i<n;++i){
- int u,v,w;
- r(u),r(v),r(w);
- addedge(++u,++v,w);
- }
- s[root=0]=SIZE=n;
- getroot(1,0);
- solve(root,n);
- if(ans==1e9)ans=-1;
- printf("%d\n",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement