如题 球球大佬帮忙看看 主要是LCA的部分
对了还有f数组的初始化 不知道什么意思 好像我没写这一部分 求大佬解答!!!
感激不尽
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
int n, m, cur;
int x, y, z;
int ver[500005*2], Next[500005*2], head[500005*2];
int deep[500005*2];
bool fl[500005*2];
int f[500005*2][21];
void add(int a, int b) {
ver[++cur] = b, Next[cur] = head[a], head[a] = cur;
}
void dfs(int t) {
fl[t] = 1;
for (int i = head[t]; i; i = Next[i]) {
int yy = ver[i];
if (fl[yy]) continue;
deep[yy] = deep[t] + 1;
dfs(yy);
}
}
int lca(int x, int y) { //倍增LCA
if (deep[x] > deep[y]) swap(x, y);
for (int i = 20; i >= 0; i--)
if (deep[f[y][i]] >= deep[x]) y = f[y][i];
if (x == y) return x;
for (int i = 20; i >= 0; i--)
if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
return f[x][0];
}
int main() {
cin >> n >> m;
for (int i = 1; i < n; i++) {
int a, b;
cin >> a >> b;
add(a, b);
add(b, a);
}
deep[1] = 1;
dfs(1);
for (int i = 1; i <= m; i++) {
cin >> x >> y >> z;
int l1 = lca(x, y),
l2 = lca(y, z),
l3 = lca(x, z);
//cout << l1 << " " << l2 << " " << l3 << endl;
if (l1 == l2) {
cout << l1 << " ";
cout << deep[x] - deep[l1] + deep[y] + deep[z] - 2 * deep[l3] << endl;
continue;
} else if (l2 == l3) {
cout << l2 << " ";
cout << deep[x] + deep[y] + deep[z] - deep[l2] - 2 * deep[l1] << endl;
continue;
} else {
cout << l3 << " ";
cout << deep[x] + deep[y] + deep[z] - deep[l3] - 2 * deep[l2] << endl;
continue;
}
}
return 0;
}
题解里面用前向星的倍增LCA:
int LCA(int x,int y) {
if(dep[x]>dep[y]) swap(x,y);
for(int i=19; i>=0; i--)
if (dep[x]<=dep[y]-(1<<i)) y=f[y][i];
if (x==y) return x;
for(int i=19; i>=0; i--)
if (f[x][i]!=f[y][i]) x=f[x][i],y=f[y][i];
return f[x][0];
}