LCA
Ray.C.L
不开longlong见祖宗
展开
-
闇の連鎖(LCA+树上差分)
思路:题目要求在树边上砍一刀,非树边砍一刀,求方案数,我们看下面这个图,在2个非树边的节点上,2个节点的lca的路径都标记1,然后遍历所有的非树边节点,可以发现,当路径上为0时,我们吧这个树边一刀砍了就已经是不连通了,此时方案数c+=m,如果路径上为1时,我们发现砍完这个树边,只需要再砍一条非树边就可以不连通此时方案数++,如果路径上大于1时,我们发现砍了这条边之后还要再砍1条非树边是不能是图不连通的。如何使得路径上同时都加上1,那么就树上差分,让2个节点x,y d[x],d[y]同时加上c,然后让他们的.原创 2021-02-20 11:20:30 · 143 阅读 · 0 评论 -
次小生成树(LCA+库鲁斯卡尔)
思路:严格次小生成树,和最小生成树只有一条边他是不同的,那么利用这一点去写,我们先做最小生成树,然后把最小生成树用到的边建无向图,我们用d1[i][j]表示i点向上跳跃2j2^j2j个点的最大边权,d2同理表示次大边权,那么次小生成树肯定是用之前没有用的边去替换这里的最大边权或最小边权构成的,我们要替换旧边时,就是替换掉lca(a,b)中的d1,d2中的一个边。 代码: #pragma GCC optimize(2) #include<bits/stdc++.h> using namesp.原创 2021-02-19 11:58:13 · 303 阅读 · 0 评论 -
距离(tarjan求LCA模板)
思路:Tanjan算法将所有点分为三类,第一类是还没有遍历过的点(标记为0),第二类是正在遍历的点(标记为1),第三类是已经遍历过且已经回溯过的点(标记为2),也就是即使回溯也不会再经过的点。那么在图中点x(属于正在遍历的的点)和点y(属于遍历过且回溯过的点),而y属于2号子树,那么x和y的公共最近祖先一定就是2号子树的根节点,1号子树也同理,所以我们需要在遍历完第二类节点的子树后,处理询问中另一个点是第三类点的最近公共祖先。 代码: #pragma GCC optimize(2) #include&l.原创 2021-02-18 12:03:45 · 177 阅读 · 1 评论 -
祖孙询问(LCA模板,倍增法)
思路:fa[i][j]表示从节点i走往上2j2^j2j个点可以跳到哪个点,那么我们先从根节点开始预处理所有的点,然后借助dep[i]表示i节点当前的深度来求LCA,首先我们吧2个节点先跳动同一深度,如果此时他们节点相同就不用再继续找了,如果不同就一起向上层跳跃,直到跳到他们相同节点的下方的第一个点。那么fa[i][0]就是最近公共祖先。 代码: //#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; ty.原创 2021-02-17 17:57:27 · 384 阅读 · 0 评论 -
小A的最短路(LCA)
思路::在树上找2点的最短距离,很容易想到LCA,那么我们在树上找a,b的最短距离,因为缆车的存在所以有3种找法,一种是直接从a节点到b,第二种是a先到缆车x加上b到缆车y的距离,第三种就是a到缆车y加上b到缆车x的距离,我们取个最小值(用C++11会TLE ) #include <cstdio> #include <cstring> #include <algorithm> #include <set> #include<iostream> ..原创 2020-07-31 22:42:14 · 219 阅读 · 0 评论 -
POJ1470(LCA)
题目链接 题意:给你一棵树,和几对结点,让你求每个结点作为LCA出现的次数 (输入是真感人多实例测试) 思路:倍增法求LCA,统计出现次数 #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #inclu...原创 2020-04-21 16:31:35 · 331 阅读 · 0 评论 -
HDU-2586 How far away(LCA模板题)
题意:给你一颗树,问你两个节点的最短距离 思路:dis[a]为根节点到a的距离那么2个节点的最短距离就是dis[a]-dis[b]-dis[lca(a,b)]*2 倍增法 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MX=40005; struct node { int...原创 2020-04-20 22:16:50 · 137 阅读 · 0 评论 -
POJ1330(LCA裸题,倍增法)
题目链接 题意:求LCA(一棵树2个节点的最近祖先节点) 思路:倍增法求LCA #include <cstring> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cmath> #include <vector> using namesp...原创 2020-04-16 21:51:00 · 246 阅读 · 0 评论