这可以说是最简单的一道了吧,用一个桶去记录就好了。
#include<bits/stdc++.h> using namespace std; const int maxn=100000+10; #define inf 1e9 int n,k; int beg[maxn],nex[maxn],to[maxn],w[maxn],e; void add(int x,int y,int z){ e++;nex[e]=beg[x]; beg[x]=e;to[e]=y;w[e]=z; } int mx,size,rt; int sz[maxn],son[maxn],vis[maxn]; inline void getrt(int x,int fa){ sz[x]=1,son[x]=0; for(int i=beg[x];i;i=nex[i]){ int t=to[i]; if(vis[t]||t==fa)continue; getrt(t,x); sz[x]+=sz[t]; if(son[x]<sz[t])son[x]=sz[t]; } if(son[x]<size-sz[x])son[x]=size-sz[x]; if(son[x]<mx)mx=son[x],rt=x; } int top,q[maxn],ans; inline void stk(int x,int fa,int val){ if(val>k)return; if(val==k){ ans++; return; } q[++top]=val; for(int i=beg[x];i;i=nex[i]){ int t=to[i]; if(t==fa||vis[t])continue; stk(t,x,val+w[i]); } } inline void divide(int x){ int bot[500+10]={0}; vis[x]=1; for(int i=beg[x];i;i=nex[i]){ int t=to[i]; if(vis[t])continue; top=0;stk(t,x,w[i]); for(int i=1;i<=top;i++) ans+=bot[k-q[i]]; for(int i=1;i<=top;i++) bot[q[i]]++; mx=inf,size=sz[t],rt=0; getrt(t,x); divide(rt); } } int main(){ cin>>n>>k; int x,y,z; for(int i=1;i<n;i++){ scanf("%d%d",&x,&y); add(x,y,1);add(y,x,1); } mx=inf,size=n,rt=0; getrt(1,0); divide(rt); printf("%d\n",ans); return 0; }
只要前面学懂了,这题应该要一遍AC,就像我一样^_^