Codeforces-337D Book of Evil【树形dp】
2017-10-23 14:26
357 查看
解题思路:
其实就是对于每个点维护它到最远关键点的距离,最后看该距离是否小于d即可。每个点维护三个值:dis1(到子树中关键点距离的最大值),dis2(到子树中关键点距离的次大值),disup(到不在其子树中关键点距离的最大值)。
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<vector> #include<queue> #define ll long long using namespace std; int getint() { int i=0,f=1;char c; for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar()); if(c=='-')f=-1,c=getchar(); for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0'; return i*f; } const int N=100005; int n,m,d,ans; int tot,first ,nxt[N<<1],to[N<<1]; int dis1 ,dis2 ,disup ; bool key ; void add(int x,int y) { nxt[++tot]=first[x],first[x]=tot,to[tot]=y; } void dfs1(int u,int fa) { if(key[u])dis1[u]=0; for(int e=first[u];e;e=nxt[e]) { int v=to[e]; if(v==fa)continue; dfs1(v,u); if(dis1[v]==-1)continue; if(dis1[v]+1>dis1[u])dis2[u]=dis1[u],dis1[u]=dis1[v]+1; else if(dis1[v]+1>dis2[u])dis2[u]=dis1[v]+1; } } void dfs2(int u,int fa) { for(int e=first[u];e;e=nxt[e]) { int v=to[e]; if(v==fa)continue; if(dis1[u]==dis1[v]+1) { if(key[v])disup[v]=max(0,max(dis2[u]+1,disup[u]+1)); else if(dis2[u]==-1&&disup[u]==-1)disup[v]=-1; else if(dis2[u]==-1)disup[v]=disup[u]+1; else if(disup[u]==-1)disup[v]=dis2[u]+1; else disup[v]=max(dis2[u],disup[u])+1; } else { if(dis1[u]==-1&&disup[u]==-1)disup[v]=-1; else if(dis1[u]==-1)disup[v]=disup[u]+1; else if(disup[u]==-1)disup[v]=dis1[u]+1; else disup[v]=max(dis1[u],disup[u])+1; } dfs2(v,u); } } int main() { //freopen("lx.in","r",stdin); //freopen("lx.out","w",stdout); memset(dis1,-1,sizeof(dis1)); memset(dis2,-1,sizeof(dis2)); memset(disup,-1,sizeof(disup)); int x,y; n=getint(),m=getint(),d=getint(); while(m--)key[getint()]=true; for(int i=1;i<n;i++) { x=getint(),y=getint(); add(x,y),add(y,x); } dfs1(1,0); dfs2(1,0); for(int i=1;i<=n;i++) { int tmp=max(disup[i],dis1[i]); if(tmp==-1)continue; else ans+=(tmp<=d?1:0); } cout<<ans; return 0; }
相关文章推荐
- Codeforces 708C Centroids(树形dp)
- Codeforces 543 D Road Improvement 树形dp
- Codeforces 935E.Fafa and Ancient Mathematics-树形dp
- codeforces 219D D. Choosing Capital for Treeland(树形dp)
- codeforces 697D Puzzles (树形dp 期望 推荐)
- Codeforces 418d Big Problems for Organizers [树形dp][倍增lca]
- codeforces 462 d Appleman and Tree(树形dp)
- Codeforces 709E. Centroids 树形DP
- CodeForces - 743D Chloe and pleasant prizes 树形DP
- CodeForces 855C Helga Hufflepuff's Cup(树形dp)
- Codeforces 711C. Bear and Tree Jumps【树形dp好题】
- [Codeforces 814D] An overnight dance in discotheque 树形dp,贪心
- codeforces 219D 树形dp
- codeforces 23E 树形DP
- bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】
- Codeforces 696B Puzzles 树形期望dp
- Codeforces 462D Appleman and Tree 树形dp
- Codeforces 835F Round #427 Div2F :树形DP
- codeforces 219D Choosing Capital for Treeland (树形DP)
- codeforces 522A A. Reposts(树形dp)