Advertisement
yicongli

LG4149

Mar 4th, 2019
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.08 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define gc c=getchar()
  6. #define r(x) read(x)
  7. #define ll long long
  8.  
  9. template<typename T>
  10. inline void read(T&x){
  11.     x=0;T k=1;char gc;
  12.     while(!isdigit(c)){if(c=='-')k=-1;gc;}
  13.     while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
  14. }
  15.  
  16. const int N=200005;
  17. const int M=1000005;
  18.  
  19. int n,m;
  20.  
  21. int root,SIZE;
  22. int s[N];
  23. int siz[N];
  24.  
  25. bool vis[N];
  26.  
  27. int ecnt;
  28. int fir[N],nex[N<<1],to[N<<1],w[N<<1];
  29.  
  30. inline void addedge(int u,int v,int c){
  31.     nex[++ecnt]=fir[u],fir[u]=ecnt,to[ecnt]=v,w[ecnt]=c;
  32.     nex[++ecnt]=fir[v],fir[v]=ecnt,to[ecnt]=u,w[ecnt]=c;
  33. }
  34.  
  35. void getroot(int x,int f){
  36.     siz[x]=1;
  37.     s[x]=0;
  38.     for(int i=fir[x];i;i=nex[i]){
  39.         int v=to[i];
  40.         if(v==f||vis[v])continue;
  41.         getroot(v,x);
  42.         siz[x]+=siz[v];
  43.         s[x]=max(s[x],siz[v]);
  44.     }
  45.     s[x]=max(s[x],SIZE-siz[x]);
  46.     if(s[x]<s[root])root=x;
  47. }
  48.  
  49. int F[M];
  50. int G[M];
  51. int CanF[N],totF;
  52. int CanG[N],totG;
  53.  
  54. void getdist(int x,int f,int dist,int step){
  55.     if(dist>m)return ;
  56.     if(!F[dist]){
  57.         CanF[++totF]=dist;
  58.         F[dist]=step;
  59.     }
  60.     else if(step<F[dist])F[dist]=step;
  61.     for(int i=fir[x];i;i=nex[i]){
  62.         int v=to[i];
  63.         if(v==f||vis[v])continue;
  64.         getdist(v,x,dist+w[i],step+1);
  65.     }
  66. }
  67.  
  68. int ans=1e9;
  69.  
  70. void solve(int x,int size){
  71.     vis[x]=1;
  72.     for(int i=fir[x];i;i=nex[i]){
  73.         int v=to[i];
  74.         if(vis[v])continue;
  75.         getdist(v,x,w[i],1);
  76.         if(F[m])
  77.         ans=min(ans,F[m]);
  78.         for(int i=1;i<=totF;++i){
  79.             if(G[m-CanF[i]])
  80.             ans=min(ans,G[m-CanF[i]]+F[CanF[i]]);
  81.         }
  82.         for(int i=1;i<=totF;++i){
  83.             if(!G[CanF[i]]){
  84.                 CanG[++totG]=CanF[i];
  85.                 G[CanF[i]]=F[CanF[i]];
  86.             }
  87.             else if(F[CanF[i]]<G[CanF[i]])G[CanF[i]]=F[CanF[i]];
  88.         }
  89.         for(int i=1;i<=totF;++i){
  90.             F[CanF[i]]=0;
  91.         }
  92.         totF=0;
  93.     }
  94.     for(int i=1;i<=totG;++i){
  95.         G[CanG[i]]=0;
  96.     }
  97.     totG=0;
  98.     for(int i=fir[x];i;i=nex[i]){
  99.         int v=to[i];
  100.         if(vis[v])continue;
  101.         s[root=0]=SIZE=(siz[x]<siz[v]?size-siz[x]:siz[v]);
  102.         getroot(v,0);
  103.         solve(root,SIZE);
  104.     }
  105. }
  106.  
  107. int main(){
  108. //  freopen(".in","r",stdin);
  109. //  freopen(".out","w",stdout);
  110.     r(n),r(m);
  111.     for(int i=1;i<n;++i){
  112.         int u,v,w;
  113.         r(u),r(v),r(w);
  114.         addedge(++u,++v,w);
  115.     }
  116.     s[root=0]=SIZE=n;
  117.     getroot(1,0);
  118.     solve(root,n);
  119.     if(ans==1e9)ans=-1;
  120.     printf("%d\n",ans);
  121.     return 0;
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement