『Two 树的直径求解及其运用』】的更多相关文章

树的直径 我们先来认识一下树的直径. 树是连通无环图,树上任意两点之间的路径是唯一的.定义树上任意两点\(u, v\)的距离为\(u\)到\(v\)路径上边权的和.树的直径\(MN\)为树上最长路径,即点\(M\)和\(N\)是树上距离最远的两个点,这条路径亦称为树的最长链. 那么,我们考虑一下如何求解树的直径. 方法一:\(DP\)求解树的直径. 设\(d_x\)表示从节点\(x\)出发走向以\(x\)为根的子树,能够达到的最远距离. 那么 \[d_x=\max_{y\in son(x)}\{…
Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 38417    Accepted Submission(s): 6957 Problem Description A school bought the first computer some time ago(so this computer's id is 1). D…
题目链接:http://poj.org/problem?id=1985 After hearing about the epidemic of obesity in the USA, Farmer John wants his cows to get more exercise, so he has committed to create a bovine marathon for his cows to run. The marathon route will include a pair o…
树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一个点,那么这两个点就是他的直径的短点,距离就是路径长度.具体证明见http://www.cnblogs.com/wuyiqi/archive/2012/04/08/2437424.html 其实这个自己画画图也能理解. POJ 1985 题意:直接让求最长路径. 可以用dfs也可以用bfs bfs代…
<题目链接> 题目大意: 给定一颗树,求出树的直径. 解题分析:树的直径模板题,以下程序分别用树形DP和两次BFS来求解. 树形DP: #include <cstdio> #include <algorithm> using namespace std; ; struct Edge{ int to,val,nxt; Edge(,,):to(_to),val(_val),nxt(_nxt){} }e[N<<]; int n,m,cnt,ans; int dp1…
<题目链接> 题目大意:求一颗带权树上任意两点的最远路径长度. 解题分析: 裸的树的直径,可由树形DP和DFS.BFS求解,下面介绍的是BFS解法. 在树上跑两遍BFS即可,第一遍BFS以任意点为起点,此时得到的离它距离最远的点为树的直径上的端点之一,然后再以这个端点为起点,跑一遍BFS,此时离它最远的点为树直径的另一个端点,同时,它们之间的距离即为树的直径. #include<iostream> #include<cstdio> #include<algorit…
树的直径 定义:树中最远的两个节点之间的距离被称为树的直径.  怎么求呢?有两种官方的算法(不要问官方指谁我也不晓得): 1.两次搜索.首先任选一个点,从它开始搜索,找到离它最远的节点x.然后从x开始搜索,找到离x最远的点y,那 么E(x, y)的长度就是树的直径.时间复杂度为O(n). 2.树形dp.这种其实更好写.我们可以对于某个节点x,分别求出经过它的最长链的长度.怎么求呢?首先,枚举x 所连接的k个节点yi(i ∈[1,k]),都求出以yi为根的子树最大深度d[yi].那么,经过x的最长…
第一题第二题鉴上我前几篇博客poj1985 poj1849:https://www.cnblogs.com/Tyouchie/p/10384379.html 第三题:数的重心:poj1655 来自sjh大佬的版子,邻接表写法 #include<algorithm> #include<bitset> #include<cctype> #include<cerrno> #include<clocale> #include<cmath> #…
题目链接 这的确是一道好题,我们不妨依循思路一步步推导,看问题是如何被解决的. 做一些约定,设$m$为树的叶子节点个数,设$len$为该树的直径(经过的点数). 毫无疑问,直径可能有多条,我们需要把所有直径都破坏掉才能终止,但这些直径并不是毫无联系的. 引理:若$len$为奇数,则所有直径有同一个中点:若$len$为偶数,则所有直径有同一条最中间的边. 至于证明,用反证法即可,大致就是如果存在两条直径的中点不是同一个,那就会产生更长的一条直径. 题目要求的终止状态就是不存在两个可以构成直径的点,…
树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c之间的距离就是树的直径. 用dfs也可以. 模板: ; int head[N]; int dis[N]; bool vis[N]; ,b,mxn=; struct edge { int to,w,next; }edge[N]; void add_edge(int u,int v,int w) { e…