随笔分类 -  programming competition in college / 树

摘要:基环树又称环套树。 其有以下特点 1.n个点n条边 2.若整个图联通(没错,基环树其实是张图),那么有且仅有一个环,可以看作是一个树加了一条边 例题:B. 复读机 参考代码 #include<bits/stdc++.h> using namespace std; const int MN=1e6+1 阅读全文
posted @ 2022-08-16 18:53 何太狼 阅读(60) 评论(0) 推荐(0)
摘要:#定义 对于树上的每一点,计算其所有子树(包括"向上"的那棵子树)中最大的子树节点数,这个值最小的点就是这棵树的重心。 OI WiKi 我的理解就是重心是整个物体(在这里是树)的平衡点,为了保持平衡从重心出发到其他点的距离都不会太大而导致失衡。 #性质 1.一棵树最少有一个重心,最多有两个重心,若有 阅读全文
posted @ 2022-07-10 16:28 何太狼 阅读(198) 评论(0) 推荐(0)
摘要:#差分数组 我们令$a[i]$表示原数组 $dif[i]$表示差分数组 那么我们就有 $$ \left{ \begin{aligned} dif[0]&=a[0]\ dif[i]&=a[i]-a[i-1],i>0 \end{aligned} \right. $$ 那么$a[i]=\sum_{k=0} 阅读全文
posted @ 2022-05-02 19:53 何太狼 阅读(78) 评论(0) 推荐(0)
摘要:最近公共祖先简称LCA(Lowest Common Ancestor)。两个节点的最近公共祖先,就是这两个点所有的公共祖先里面,离根最远的那个。 \(d(u,v)=h(u)+h(v)-2*h(lca(u,v))\) 例题 P3379 【模板】最近公共祖先(LCA) #Tarjan求解最近公共祖先 基 阅读全文
posted @ 2022-05-01 22:07 何太狼 阅读(73) 评论(0) 推荐(0)
摘要:#DFS序 DFS序代表着树从根节点开始进行DFS的节点的遍历顺序。 那么上图的DFS序显然为1,2,4,7,8,9,5,3,6 容易发现一棵子树内所有结点的DFS序是连续的,并且根节点的DFS序最小。那么假设我们已经有整颗树的DFS序为dfn[u], 子树的大小为size[u],就可以得到结点u的 阅读全文
posted @ 2022-04-30 19:53 何太狼 阅读(2196) 评论(0) 推荐(3)
摘要:#前序遍历 先输入相关信息,然后遍历左节点,最后遍历右节点。 void dfs(int s){ if(s){ cout<<s<<" "; dfs(lson[s]); dfs(rson[s]); } } #中序遍历 先遍历左节点,然后输出该节点的相关信息,最后遍历右节点 void dfs(int s) 阅读全文
posted @ 2022-04-23 18:25 何太狼 阅读(62) 评论(0) 推荐(0)
摘要:以下主要内容来自oi-wiki 树上任意两节点之间最长的简单路径(路径上的顶点都不相同的路径)即为树的「直径」。 一棵树可以有多条直径,他们的长度相等。 可以用两次DFS或者树形DP的方法在O(n)时间求出树的直径。 #两次DFS 首先从任意节点$y$开始进行第一次DFS,到达距离其最远的节点,记为 阅读全文
posted @ 2022-02-13 15:23 何太狼 阅读(275) 评论(0) 推荐(0)