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=40005;
- const int INF=1e9;
- int n,m;
- 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;
- }
- int SIZE,root;
- int s[N];
- int siz[N];
- bool vis[N];
- //getroot
- void dfs1(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;
- dfs1(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;
- }
- //getdis
- int dis[N];
- int tot,tmp[N];
- void dfs3(int x,int f){
- tmp[++tot]=dis[x];
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(v==f||vis[v])continue;
- dis[v]=dis[x]+w[i];
- dfs3(v,x);
- }
- }
- inline ll calc(int x,int v){
- tot=0;
- dis[x]=v;
- dfs3(x,0);
- sort(tmp+1,tmp+tot+1);
- int l=1,r=tot;
- ll sum=0;
- while(l<r){
- if(tmp[l]+tmp[r]<=m){
- sum+=r-l;
- ++l;
- }
- else --r;
- }
- return sum;
- }
- ll ans;
- //solve
- void dfs2(int x){
- ans+=calc(x,0);
- vis[x]=1;
- for(int i=fir[x];i;i=nex[i]){
- int v=to[i];
- if(vis[v])continue;
- ans-=calc(v,w[i]);
- root=0;
- SIZE=siz[v];
- dfs1(v,0);
- dfs2(root);
- }
- }
- int main(){
- // freopen(".in","r",stdin);
- // freopen(".out","w",stdout);
- r(n);
- for(int i=1;i<n;++i){
- int u,v,w;
- r(u),r(v),r(w);
- addedge(u,v,w);
- }
- r(m);
- s[root]=SIZE=n;
- dfs1(1,0);
- dfs2(root);
- printf("%lld\n",ans);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement