摘要: 求一棵树上距离最远的两个顶点的距离,就是求树的直径。做法是两次BFS或DFS。设r是树T的根,u是距离r最远的结点,v是距离u最远的结点。则树的直径就是d(u , v)。可以用反证法证明:http://wenku.baidu.com/view/00d9168984868762caaed5a4.html(图的直径可以用Floyd做:http://blog.csdn.net/sunmenggmail/article/details/7739419)下面是一个DFS实现,里面用无向图(就是对称的有向图)来表示树,所以很方便从任何一个点DFS。做完DFS,返回节点号就行了。两次调用完,ans_path 阅读全文
posted @ 2013-10-13 22:38 阿牧遥 阅读(484) 评论(0) 推荐(0)
摘要: http://poj.org/problem?id=3264经典的RMQ题目。RMQ问题是求给定区间中的最值问题。朴素算法是O(n)的,用线段树可以将算法优化到O(logn)(在线段树中保存线段的最值)。不过,只查询的话RMQ算法最合适:它可以在O(nlogn)的预处理以后实现O(1)的查询效率。线段树主要的区别是可以修改区间,RMQ不行。下面把Sparse Table算法分成预处理和查询两部分来说明。 使用了倍增思想。预处理:以求最大值为例,设d[i,j]表示[i,i+2^j-1]这个区间内的最大值,那么在询问到[a,b]区间的最大值时答案就是max(d[a,k], d[b-2^k+1,k] 阅读全文
posted @ 2013-10-13 14:10 阿牧遥 阅读(193) 评论(0) 推荐(0)