COJ 2003 选根 (树的重心)】的更多相关文章

我们可以用树形DP在线性复杂度内搞定重心. #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<queue> #include<cstring> #define PAU putchar(' ') #define ENT putchar('\n') using namespace std; +; ];,fch[maxn]; vo…
http://poj.org/problem? id=1655 Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9072   Accepted: 3765 Description Consider a tree T with N (1 <= N <= 20,000) nodes numbered 1...N. Deleting any node from the tree yields a f…
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之…
Update:原来的洛谷U21715已成坑qwq 已经被某位管理员巨佬放进公共题库啦!又可以多一个AC记录啦! 洛谷题目传送门 其实也可以到这里交啦 思路分析 动态维护树的重心 题目中说到国家的首都会选在某个使得其他城市到它距离之和最小的城市,那不就是树的重心了嘛.树的重心性质真的很好,看看wuhulala巨佬的这篇博客. 网上大多数解法都是启发式合并.利用了以重心为根的子树大小不超过原树的一半,每次合并两颗树的时候,小的往大的上面合并,而且是一个点一个点地link上去,每次link完检查一下这…
先考虑一个\(O(N^2)\)做法. 设选的两个点为\(x,y\),则一定可以将树分成两个集合\(A,B\),使得\(A\)集合所有点都去\(x\),\(B\)集合所有点都去\(y\),而这两个集合的分界点就是树上的一条边.于是考虑枚举断哪条边,然后对两边分别跑一遍带权树的重心,统计答案加起来取最小值就行了. 现在进行优化,求树的重心的方法可以参考医院设置. 以\(1\)为根建树,\(f[u]\)表示所有点到\(u\)的总距离.(人数乘以距离) 转移方程是: \[f[v]=f[u]+size[1…
题意:求树的重心的编号以及重心删除后得到的最大子树的节点个数size,假设size同样就选取编号最小的. 思路:随便选一个点把无根图转化成有根图.dfs一遍就可以dp出答案 //1348K 125MS C++ 1127B #include<cstdio> #include<iostream> #include<cstring> #include<algorithm> #include<vector> using namespace std; in…
三倍的幸福! 暴力的做法就是枚举每一条边断开,选的两个点就是左右两棵树的重心. 可以发现找重心的时候一定是往权和大的子树找的,需要维护一个点的最大和次大子树,因为最大子树可能被割掉了,实际效率为O(NH). 设sum[i]为子树i的权和,core[i]为i的子树中i作为重心的答案. 断掉一条边(x,y)的时候两棵树一棵包含根,一棵包含y,则一棵的答案为core[root]-core[y]-sum[y]*dep[y],一棵为core[y],找重心到x时更新答案now=now+sum[root]-2…
题意:给你一颗树,问这颗树是否存在一个根,使得对于任意两点,如果它们到根的距离相同,那么它们的度必须相等. 思路1:树的重心乱搞 根据样例发现,树的重心可能是答案,所以我们可以先判断一下树的重心可不可以.如果不行,剩下的只可能是度为1点当根了.当然,我们不能枚举所有度为1的点,不然一个菊花图就超时了,我的做法是对于以重心为根的树搜索一遍,对于每个深度的度数为1的点只记录一个,然后枚举这些点,如果有就是有,否则没有.这样最坏的复杂度应该能到O(n * sqrt(n)),但是肯定跑不满.至于为什么这…
前言:寒假讲过树形DP,这次再复习一下. -------------- 基本的树形DP 实现形式 树形DP的主要实现形式是$dfs$.这是因为树的特殊结构决定的——只有确定了儿子,才能决定父亲.划分阶段的话一般是$f[i][j][0/1]$.$i$表示以$i$为根的子树,$j$一般表示保留$j$个子节点,$0/1$表示选/不选这个节点.一般第三维可以省去. 基本的DP方程 选择节点类 $f[i][0]=f[j][1]$ $f[i][1]=max/min(f[j][0],f[j][1])$ 背包类…
FJOI2014 树的重心 \(Q\) 组测试数据.给一棵树大小为 \(n\),求有多少个子树与其重心相同.重心可能有多个. 数据范围:\(1\le Q\le 50\),\(1\le n\le 200\). 就是要写好几个 \(\tt dp\) 吧,细节比较多. 先 \(\tt Dfs\) 一次找个重心: int sz[N+7],g[N+7]; int Dfs1(int u,int fa){ int res=inf; sz[u]=1,g[u]=0; for(int&v:e[u])if(v!=fa…