![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树的直径和基环树
lemondinosaur
转圈圈 不停转圈圈 然后摔倒
展开
-
#基环树,树形dp#洛谷 2607 JZOJ 1723 骑士
题目 有环的没有上司的舞会 分析 那么有环那就不是树形dp了,如何处理环,可以先连起来,树形dp,再把环断掉,再跑一次树形dp,两次的最大值即为答案 代码 #include <cstdio> #include <cctype> #define rr register using namespace std; const int N=1000010; long long ...原创 2019-01-28 12:06:14 · 158 阅读 · 0 评论 -
#基环树,拓扑排序,深搜#洛谷 5022 JZOJ 5964 旅行
题目链接 分析 首先可以贪心选择字典序小的点先跑,所以可以把边按照小到大排序,但是由于邻接表是反过来的,所以说要反过来排序,好的 ,那么m=n−1m=n-1m=n−1的子任务就可以做完了,但是基环树这个子任务是不可以的,因为一条边最多跑两次,既然存在环,所以要把环断掉,首先先跑一遍拓扑排序,判断环上的点,并对于环断边,用树的方式记录字典序最小排列 代码 #include <cstdio&...原创 2019-04-27 10:47:19 · 211 阅读 · 0 评论 -
#单调队列,树的直径#bzoj 1999 洛谷 1099 树网的核
洛谷链接 bzoj链接 分析 首先两遍bfs求出树的直径,预处理对于每个点的最大偏心距,枚举直径上的左端点lll,那么对于右端点rrr,答案就是max(max(mxii∈[l∼r]),max(dis[r]−dis[s],dis[t]−dis[l]))max(max(mx_i i\in[l\sim r]),max(dis[r]-dis[s],dis[t]-dis[l]))max(max(mxii...原创 2019-06-01 13:44:09 · 116 阅读 · 0 评论 -
#基环树,单调队列#洛谷 4381 BZOJ 1791 JZOJ 2304 Island
题目 分析 这道题也就是求各棵基环树的直径之和,那么可能在去掉环的某棵子树里,或是经过环,其两端分别在去掉环上所有边之后的两棵不同子树中。首先在基环树中断环求最大的树的直径,就可以解决第一个情况,其次,可以用单调队列实现第二种情况,把环上的点复制一份做dp,就可以解决问题 代码 #include <cstdio> #include <cctype> #include &...原创 2019-08-05 20:24:46 · 162 阅读 · 0 评论