全WA求助 应该是LCA的错但是真的和板子一模一样了()
查看原帖
全WA求助 应该是LCA的错但是真的和板子一模一样了()
323183
CLCK楼主2022/10/14 14:30

如题 球球大佬帮忙看看 主要是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];
}
2022/10/14 14:30
加载中...