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

以下转自:https://www.cnblogs.com/Khada-Jhin/p/10195287.html

DP求法:

DP求直径的方法是对于每个点记录这个点子树中的最长链及与最长链处于不同子树中的次长链,用每个点的最长链+次长链更新直径,然后再将最长链上传到父节点更新父节点的最长链或次长链。这种求法适用于所有求树的直径的情况。

性质:

1、直径两端点一定是两个叶子节点

2、距离任意点最远的点一定是直径的一个端点,这个基于贪心求直径方法的正确性可以得出

3、对于两棵树,如果第一棵树直径两端点为(u,v)(u,v),第二棵树直径两端点为(x,y)(x,y),用一条边将两棵树连接,那么新树的直径一定是u,v,x,y,u,v,x,y,中的两个点

证明:如果新树直径不是原来两棵树中一棵的直径,那么新直径一定经过两棵树的连接边,新直径在原来每棵树中的部分一定是距离连接点最远的点,即一定是原树直径的一个端点。

4、对于一棵树,如果在一个点的上接一个叶子节点,那么最多会改变直径的一个端点

证明:假设在xx下面接一个点yy,直径变成了(u,x)(u,x),原树直径为(a,b)(a,b),那么dis(u,x)>dis(a,b),dis(u,x)=dis(u,y)+1dis(u,x)>dis(a,b),dis(u,x)=dis(u,y)+1,即dis(u,y)+1>dis(a,b)dis(u,y)+1>dis(a,b),如果dis(u,y)<dis(a,b)dis(u,y)<dis(a,b),那么显然不成立;如果dis(u,y)=dis(a,b)dis(u,y)=dis(a,b),那么(u,y)(u,y)也是原树的直径,符合上述结论。

5、若一棵树存在多条直径,那么这些直径交于一点且交点是这些直径的中点

#include <cstdio>
#include <cstdlib>
#include <cassert>
#include <cstring>
#include <bitset>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef vector<long long> VI;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define SZ(x) ((long long)(x).size())
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod ll(1e9+7)
#define pb push_back
#define eps 1e-6
#define lc d<<1
#define rc d<<1|1
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
int n,m,dd,a[100008],x,y,pos,sd,sf,b[100008],ans;
vector<int>g[100008];
void dfs(int u,int fa,int d,int z)
{if(z&&d<=dd) b[u]++;if(a[u]&&d>sd) sd=d,pos=u;for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v==fa) continue;dfs(v,u,d+1,z);}
}
void dfs1(int u,int fa,int d)
{if(a[u]&&d>sd) sd=d,sf=u;for(int i=0;i<g[u].size();i++){int v=g[u][i];if(v==fa) continue;dfs1(v,u,d+1);}
}
int main()
{cin.tie(0);cout.tie(0);cin>>n>>m>>dd;FOR(i,1,m) si(x),a[x]=1;FOR(i,1,n-1){si(x),si(y);g[x].pb(y);g[y].pb(x);}dfs(1,0,0,0);sf=pos,sd=0,dfs1(pos,0,0);dfs(pos,0,0,1),dfs(sf,0,0,1);FOR(i,1,n) if(b[i]>=2) ans++;cout<<ans<<endl;return 0;
}

codeforces 337 D(树的直径性质)相关推荐

  1. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  2. Codeforces 337D Book of Evil:树的直径【结论】

    题目链接:http://codeforces.com/problemset/problem/337/D 题意: 给你一棵树,n个节点. 如果一个节点处放着"罪恶之书",那么它会影响 ...

  3. Two Paths CodeForces - 14D(暴力+树的直径)

    As you know, Bob's brother lives in Flatland. In Flatland there are n cities, connected by n - 1 two ...

  4. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  5. 51 nod 1427 文明 (并查集 + 树的直径)

    1427 文明 题目来源: CodeForces 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 160 难度:6级算法题 安德鲁在玩一个叫"文明"的游戏.大妈正在 ...

  6. poj1985 Cow Marathon(树的直径#入门)

    poj1985 Cow Marathon(树的直径) Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 9110 Accepted: ...

  7. 树的直径,树的最长路dp思想

    dp一直弱死了,树型dp很多基本的题都不会,最近在刷树型dp的题,把关于树的最长路的思想总结一下: 树的直径:树中距离最远的两点间的距离. 下面说几道题: hdu 2196:对于树上(双向边)的每一个 ...

  8. 树的直径/重心 学习笔记

    树的直径 POJ2631 Roads in the North 题意:裸的直径 题解:套模板,但是开始的时候,我的代码在第一次dfs循环的时候,没有考虑到,路长全为0的情况,而用来记录最远点的maxp ...

  9. 树的直径,树的重心,树的分冶

    主要是利用了反证法: 假设 s-t这条路径为树的直径,或者称为树上的最长路 现有结论,从任意一点u出发搜到的最远的点一定是s.t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两 ...

  10. 树的直径1——树的直径

    树的直径1--树的直径 目录 题目:树的直径1 题面 题目描述 输入描述 输出描述 样例输入 样例输出 数据范围 代码及思路 解题思路 AC代码 知识点:树的直径 定义 性质 查找"树的直径 ...

最新文章

  1. 开箱即用的VScode C++环境
  2. 【Linux】4_基本权限ACL的命令(setacl和getacl)
  3. Blazor WebAssembly 3.2.0 Preview 4 如期发布
  4. MySQL多种安装方式选择
  5. 统计各个函数的耗时_分享一次CMS GC耗时狠高优化过程全记录
  6. select函数(一)
  7. svr公式推导_ML-支持向量:SVM、SVC、SVR、SMO原理推导及实现
  8. VC6.0 中的__asm语句
  9. JAVA a --; 与 -- a;
  10. (06)Vivado约束基础
  11. 弘辽科技:直通车测款的必备技巧
  12. 神操作!我把 3000 行代码重构成 15 行!
  13. win7共享网络的方法简述
  14. 利用python快速转换GenBank和RefSeq的染色体号
  15. 小米笔记本目前仅win10系列系统支持触摸板
  16. 小米应用使用时间统计_应用统计Screentime|一款帮你知道每天手机和APP使用时间的软件 | 我爱分享网...
  17. 带你渐入佳境,一文捋清协程
  18. 1+..+ 100 高斯求和
  19. 消息中间件原理概念篇
  20. mysql下载简书_安装MySQL

热门文章

  1. 关于Palantir—第四部分:Palantir应用程序
  2. C语言函数题-输入多个单词,统计以指定字母开头的单词个数
  3. 25~30K的国外企业招聘面试考题,10分钟就能写出来了?
  4. 不良资产证券化信披 担任怎样的角色
  5. Android子控件超出父控件的范围被覆盖问题
  6. 数据结构课程设计:17、售票处的服务系统(***)
  7. Ubuntu 20 更新后突然无法获取IP
  8. 做到这十点中的三点你就是成功人士
  9. 联想电脑阻止c语言运行,联想电脑运行程序打不开怎么解决
  10. module项目没有蓝色小方块问题