随笔分类 - 

摘要:嘟嘟嘟 题说的很明白,就是求树的重心。 我们首先dfs一遍维护每一个点的子树大小,然后再dfs一遍,对于一个点u,选择子树中size[v]最小的那个和n - size[u]比较,取最大作为删除u后的答案Max[u]。 然后再O(n)遍历一遍取min(Max[i]). 写代码的时候两次dfs可以合并。 阅读全文
posted @ 2018-09-13 15:50 mrclr 阅读(178) 评论(0) 推荐(0)
摘要:嘟嘟嘟 树形dp。 首先一个很常规的想法就是如果u到v有一条边,那么建立cost(u, v) = 0, cost(v, u) = 1的两条边. 可以两遍dfs。 先任选一个点作为根节点,第一遍从下往上dfs,维护节点u到他的所有子节点的距离,很容易得出dis[u] = ∑dis[v] + cost( 阅读全文
posted @ 2018-09-13 14:43 mrclr 阅读(215) 评论(0) 推荐(0)
摘要:嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以)。 可以证明,只要求出任意一条直径就行了,为什么呢?考虑一下,如果我们在直径上选了一段,那么最远偏心距可肯定是到直径两端的最大值,和直径外的点无关,只 阅读全文
posted @ 2018-09-10 11:03 mrclr 阅读(180) 评论(0) 推荐(0)
摘要:嘟嘟嘟 题中说任意两个点之间只有唯一1条路径,意思就是这是个树~ 概括一下,就是求min(c->a, c->b) + a->b 的最大值。 显然,让整体最大,那就让这两项最大即可,a->b的最大值显然就是树的直径,跑两遍bfs(最短路)就行。 至于第一项,枚举c,每一次求出a->c, b->c的两者 阅读全文
posted @ 2018-08-30 17:56 mrclr 阅读(369) 评论(0) 推荐(0)
摘要:嘟嘟嘟 对于求深度和宽度都很好维护。深度dfs时维护就行,宽度统计同一个深度的节点有多少个,然后取max。 对于求距离,我刚开始以为是要走到根节点在回来,然后固输了(dep[u] - 1) * 2 + dep[v] - 1,结果竟然得了80分,数据有点水过头了…… 实际上就是求LCA,然而因为只求一 阅读全文
posted @ 2018-08-21 11:18 mrclr 阅读(166) 评论(0) 推荐(0)
摘要:设有一棵二叉树,如图其中,圈中数字表示结点居民的人口.圈边上数字表示结点编号,现在要求在某个结点上建立一个医院,使所有居民所走的路程之和为最小,同时约定,相邻结点之间的距离为1.如上图中,若医院建在:1 处:则距离之和=4+12+2*20+2*40=1363 处:则距离之和=4*2+13+20+40 阅读全文
posted @ 2018-04-13 23:41 mrclr 阅读(245) 评论(0) 推荐(0)