#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long LL; const int MAXN=10000+100; struct Edge { int to,next,w; Edge(){} Edge(int _to,int _next,int _w):to(_to),next(_next),w(_w){} }e[MAXN<<1]; int head[MAXN],tot; void init(){ memset(head,-1,sizeof(head)); tot=0; } void AddEdge(int u,int v,int w){ e[tot]=Edge(v,head[u],w); head[u]=tot++; e[tot]=Edge(u,head[v],w); head[v]=tot++; } int n,K; int has[MAXN],root,siz[MAXN],ts[MAXN]; void getroot(int u,int fa){ siz[u]=1; ts[u]=0; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v]||v==fa)continue; getroot(v,u); siz[u]+=siz[v]; ts[u]=max(ts[u],siz[v]); } ts[u]=max(ts[u],ts[0]-siz[u]); if(ts[u]<ts[root])root=u; } int dis[MAXN],res[MAXN]; void getdis(int u,int fa){ res[++res[0]]=dis[u]; siz[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v]||v==fa)continue; dis[v]=dis[u]+e[i].w; getdis(v,u); siz[u]+=siz[v]; } } int calc(int u,int init){ dis[u]=init;res[0]=0;getdis(u,u); sort(res+1,res+1+res[0]); int l=1,r=res[0]; int ans=0; while(l<r){ if(res[l]+res[r]<=K)ans+=r-l++; else --r; } return ans; } int Ans; void dfs(int u){ Ans+=calc(u,0); has[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v])continue; Ans-=calc(v,e[i].w); root=0;ts[0]=siz[v]; getroot(v,v); dfs(root); } } int main(){ while(~scanf("%d%d",&n,&K)){ if(n+K==0)break; init(); memset(has,0,sizeof(has)); for(int i=0,x,y,w;i<n-1;i++){ scanf("%d%d%d",&x,&y,&w); AddEdge(x,y,w); } root=0;ts[0]=n; getroot(1,1); Ans=0; dfs(root); printf("%d\n",Ans); } return 0; }
|