题目链接:http://codeforces.com/problemset/problem/337/D

参考博客:http://www.cnblogs.com/chanme/p/3265913

题目大意:给你一个n个点的无向树。任意两点的距离为中间经过的边数。现在某个点上有本魔法书,这本书对与这个点距离小于等于d的点有影响。给你收集到的m个受影响的点(信息不一定全对)。要你判断有多少个点可能放魔法书。

算法思路:我参考别人的想法,自己开始怎么也想不出好的算法,n也太大。这题用树形dp,两遍dfs来统计出每一个点到所有这个m个受影响点的距离的最大值。只要这个最大值<=d,就可能放魔法书。 所以关键就是算这个最大值,有树形dp第一遍就可以统计以u为根,u到子树中存在的受影响点的最大值。第二遍要利用父亲和兄弟节点来求出u到剩余受影响点(即不在u的子树上的点)的最大值。然后和在一起就是u到所有受影响点的最大值。

代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std; const int maxn = ;
const int INF = 0x3f3f3f3f; int disDown[maxn]; //disDown[u]表示以u为根的子树Pm中的点到u距离的最大值。
int disUp[maxn]; //disUp[u]表示以u为根去掉上面的子树中的点,u到与父亲相连的所有pm的最大值。
int Max[maxn]; //Max[u]表示u为根子树Pm中的点到u距离的最大值。
int SecMax[maxn]; //SecMax[u]表示u为根子树Pm中的点到u距离的第二大值。
int n,m,d;
vector<int> G[maxn]; void dfs1(int u,int fa)
{
for(int i=,sz=G[u].size(); i<sz; i++)
{
int v = G[u][i];
if(v == fa) continue; dfs1(v,u);
if(disDown[v]+ > SecMax[u])
{
SecMax[u] = disDown[v] + ;
if(SecMax[u] > Max[u])
swap(SecMax[u],Max[u]);
}
}
disDown[u]=max(disDown[u],Max[u]);
} void dfs2(int u,int fa)
{
for(int i=,sz=G[u].size(); i<sz; i++)
{
int v = G[u][i];
if(v == fa) continue; if(disDown[v] + == Max[u])
disUp[v] = max( disUp[v] , max(disUp[u],SecMax[u])+ ); else
disUp[v] = max( disUp[v] , max(disUp[u],Max[u])+ ); dfs2(v,u);
}
} int main()
{
//freopen("E:\\acm\\input.txt","r",stdin);
cin>>n>>m>>d; memset(disDown,-0x3f,sizeof(disDown));
memset(disUp,-0x3f,sizeof(disUp));
memset(Max,-0x3f,sizeof(Max));
memset(SecMax,-0x3f,sizeof(SecMax)); for(int i=; i<=m; i++)
{
int pm;
scanf("%d",&pm);
disDown[pm] = disUp[pm] = ;
} for(int i=; i<=n; i++) G[i].clear();
for(int i=; i<n; i++)
{
int u,v;
scanf("%d %d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
} dfs1(,-);
dfs2(,-); int ans = ;
for(int i=; i<=n; i++)
if(disDown[i] <= d && disUp[i] <= d)
ans ++;
printf("%d\n",ans);
}

codeforces 337D Book of Evil (树形dp)的更多相关文章

  1. CF 337D Book of Evil 树形DP 好题

    Paladin Manao caught the trail of the ancient Book of Evil in a swampy area. This area contains n se ...

  2. codeforce 337D Book of Evil ----树形DP&bfs&树的直径

    比较经典的老题 题目意思:给你一颗节点数为n的树,然后其中m个特殊点,再给你一个值d,问你在树中有多少个点到这m个点的距离都不大于d. 这题的写法有点像树的直径求法,先随便选择一个点(姑且设为点1)来 ...

  3. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  4. Codeforces 1276D - Tree Elimination(树形 dp)

    Codeforces 题面传送门 & 洛谷题面传送门 繁琐的简单树形 dp(大雾),要是现场肯定弃了去做 F 题 做了我一中午,写篇题解纪念下. 提供一种不太一样的思路. 首先碰到这样的题肯定 ...

  5. Codeforces 543D Road Improvement(树形DP + 乘法逆元)

    题目大概说给一棵树,树的边一开始都是损坏的,要修复一些边,修复完后要满足各个点到根的路径上最多只有一条坏的边,现在以各个点为根分别求出修复边的方案数,其结果模1000000007. 不难联想到这题和H ...

  6. Codeforces 337D Book of evil

    一道树形dp,写出来是因为最近也做了道类似的.这题是看了分析的思路才做出来的,但感觉很多这样的dp都是利用类似的性质.像这题的话distDown很好想,但distUp的时候就很难想了,其实只要抓住di ...

  7. Codeforces 815C Karen and Supermarket 树形dp

    Karen and Supermarket 感觉就是很普通的树形dp. dp[ i ][ 0 ][ u ]表示在 i 这棵子树中选择 u 个且 i 不用优惠券的最小花费. dp[ i ][ 1 ][ ...

  8. Codeforces 627D Preorder Test(二分+树形DP)

    题意:给出一棵无根树,每个节点有一个权值,现在要让dfs序的前k个结点的最小值最大,求出这个值. 考虑二分答案,把>=答案的点标记为1,<答案的点标记为0,现在的任务时使得dfs序的前k个 ...

  9. Codeforces 919D Substring (拓扑排序+树形dp)

    题目:Substring 题意:给你一个有向图, 一共有n个节点 , m条变, 一条路上的价值为这个路上出现过的某个字符最多出现次数, 现求这个最大价值, 如果价值可以无限大就输出-1. 题解:当这个 ...

随机推荐

  1. IIS防止同一IP大量非法访问

    在服务器设置访问规则,屏蔽恶意ip就可以了

  2. 关于shell脚本编程的10个最佳实践

    每一个在UNIX/Linux上工作的程序员可能都擅长shell脚本编程.但大家解决问题的方式却不尽相同,这要取决于对专业知识的掌握程度.使 用命令的种类.看待问题的方式等等.对于那些处在shell脚本 ...

  3. OC基础-day02

    #pragma mark - Day02_01_对象的创建与使用 1)如何通过类创建一个对象 1. 类是抽象的,无法直接使用 2. 对象是类的一个具体实现,可以直接使用 3. 语法 类名 *对象名 = ...

  4. codevs 4511 信息传递(NOIP2015 day1 T2)

    4511 信息传递 NOIP2015 day1 T2 时间限制: 1 s 空间限制: 128000 KB 传送门 题目描述 Description 有个同学(编号为 1 到)正在玩一个信息传递的游戏. ...

  5. HDU1878欧拉回路

    这道题WA了好多次.测试数据感觉有点问题-- 并查集啊,必须有. #include<stdio.h> #include<string.h> int ad[1003]; int ...

  6. php 解决大流量网站访问量问题

    当一个网站发展为知名网站的时候(如新浪,腾讯,网易,雅虎),网站的访问量通常都会非常大,如果使用虚拟主机的话,网站就会因为访问量过大而引起 服务器性能问题,这是很多人的烦恼,有人使用取消RSS等错误的 ...

  7. 获取数据后导出Excel

    List<PortResourceInfo> list = getList()//获取数据源 //导出excle Response.Clear(); Response.ContentTyp ...

  8. js 组件的写法

    var Test1 = function(){ var name = ""; this.setName = function(username){ name = username; ...

  9. Python正则表达式2

  10. js实现中文转拼音

    首先需要注意ES6在严格模式下中常量太长会出问题,CHAR_DICT.FULL_DICT.POLYPHONE都是很大的常量,所以我都外部加载了,否则编译运行会有问题,先贴代码,常量在最后,如下: js ...