好久没刷题了,复习一下:LCA。
题目详情
题目很简单,就是求多叉树两个点的最近公共祖先。
链接: 洛谷 P3379
LCA(Least Common Ancestors),即最近公共祖先,是指在有根树中,找出某两个结点u和v最近的公共祖先。 ———来自百度百科
![818487-20151004150339121-181913844.png]()
图中,4 和 3 的 LCA 就是 1。
解题
最简单的方法 (暴力)
这种方法数据一大就会TLE。
原理很简单,让两个数一个一个向上走,直到两个数相遇。第一次相遇就是他们的 LCA。
很简单,就不赘述了,直接上代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
| #include <cmath> #include <cstdio> #include <iostream> #include <vector>
using namespace std;
#define MAX 500000
vector<int> tree[MAX]; int dep[MAX]; int fas[MAX];
namespace M1 { void dfs(int x, int fa) { if (fa != -1) { dep[x] = dep[fa] + 1; }... |