题目描述树的直径必然取自某个节点的两个(或一个)最深的子树,可以一遍DFS解决。#include #include #include using namespace std;vector tree[100005];bool has_parent[100005] = { false };int max...
分类:
其他好文 时间:
2015-05-05 10:28:35
阅读次数:
121
定义:n个节点的树,任选一个节点V0,找到距离它最远的节点V1,再找距离V1最远的节点V2,edge(V1,V2) 即为树的直径.
理解:edge(V0,V1)一定会经过root(不理解的话你画个图试试~),则edge(root,V1)即为距离root最长,或次长的边.
因此,再从V1出发,找距离V1最远的节点V2,必定通过root,所以可以看成是找距离root最远的节点V2(不能回头搜索V1...
分类:
其他好文 时间:
2015-04-25 18:24:14
阅读次数:
143
先来说一下怎样来求树的直径:假设 s-t这条路径为树的直径,或者称为树上的最长路现有结论,从任意一点u出发搜到的最远的点一定是s、t中的一点,然后在从这个最远点开始搜,就可以搜到另一个最长路的端点,即用两遍广搜就可以找出树的最长路证明:1 设u为s-t路径上的一点,结论显然成立,否则设搜到的最远点为T则dis(u,T) >dis(u,s) 且 dis(u,T)>dis(u,t)...
分类:
其他好文 时间:
2015-04-22 18:15:27
阅读次数:
174
假设树的直径的两个端点为p0,p1。如果对于一次询问(v,k)存在点q满足要求,那么q必然在v到p0或v到p1的路径上。
剩下的就是在树上寻找p了。倍增就好了。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define LL long long
#defi...
分类:
其他好文 时间:
2015-04-16 17:43:34
阅读次数:
131
题解:
对于 k==0k==0 的情况:
我们发现遍历一棵树最后回到原点,那么对于所有的边,我们都是走过去,再走回来。
答案 (n?11)(n-1
对于 k==1k==1 的情况
设每条边长度为1,然后树上找最长链,然后这条链走过去就不再一步步往回了,直接从链底连一条边去链顶,然后链中间连的那些点,直接走过去再走回来,它们那些边的答案是不变的。
答案 (n?11)?(链长度)+1(n-...
树的最长路径,即求一颗树的直径问题,dfs和bfs都可一解决,但一直觉得dfs的比较绕,不好理解。于是写了bfs的方法,其中0节点当作哨兵,每次从队列中取出0节点的时候,就知道一轮bfs结束,可以把深度加一。bfs的思路很简单:1.随便找一个节点,以该节点为起点进行一次bfs,得出的最后一个顶点,一...
分类:
其他好文 时间:
2015-04-13 20:17:08
阅读次数:
131
真的还有好多东西要学啊......定理: 选取树 $T$ 的任意一个点 $i$ ,则与 $i$ 距离最远的节点 $r$ 必定是树中一条直径的端点.定理: 一棵树的直径一定能表示为原树 $T$ 上某个端点AC VIJOS 1476 求在直径上的所有点. 直径可能有多条. 1 #include 2...
分类:
其他好文 时间:
2015-04-02 22:27:14
阅读次数:
292
题目链接:点击打开链接
Network Mess
Gilbert is the network admin of Ginkgo company. His boss is mad about the messy network cables on the floor. He finally walked up to Gilbert and asked the lazy netwo...
分类:
Web程序 时间:
2015-03-31 14:41:10
阅读次数:
208
树的直径,即这棵树中距离最远的两个结点的距离。每两个相邻的结点的距离为1,即父亲结点与儿子结点或儿子结点与父子结点之间的距离为1.有趣的是,从树 的任意一个结点a出发,走到距离最远的结点b,再从结点b出发,能够走的最远距离,就是树的直径。树中相邻两个结点的距离为1。你的任务是:给定一棵树, 求这棵...
分类:
其他好文 时间:
2015-03-30 20:37:17
阅读次数:
147