LCA模板题求助
  • 板块学术版
  • 楼主emo_male_god
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/3 22:50
  • 上次更新2023/11/2 22:47:41
查看原帖
LCA模板题求助
798157
emo_male_god楼主2023/9/3 22:50

题目链接

不知道为啥就 WA 了

这是我的代码

#include <iostream>
#include <cstring>
#include <cmath>

using namespace std;

const int N = 1e3 + 5;

int t, n, m, q, dep[N], fa[N][15], s;
int to[N], ne[N], head[N], idx;

void dfs(int u)
{
	dep[u] = dep[fa[u][0]] + 1;
	s = ceil(log2(dep[u]));
	for (int i = 1; i <= s; i ++ ) fa[u][i] = fa[fa[u][i - 1]][i - 1];
	for (int i = head[u]; i != -1; i = ne[i]) dfs(to[i]);
}

int LCA(int x, int y)
{
	s = ceil(log2(n));
	if (dep[x] < dep[y]) swap(x, y);
	int k = dep[x] - dep[y];
	for (int i = s; i >= 0; i -- ) if (k & (1 << i)) x = fa[x][i];
	if (x == y) return x;
	s = ceil(log2(dep[x]));
	for (int i = s; i >= 0; i -- ) if (fa[x][i] != fa[y][i]) x = fa[x][i], y = fa[y][i];
	return fa[x][0];
}

int main()
{
	scanf("%d", &t);
	for (int LHY = 1; LHY <= t; LHY ++ )
	{
		memset(head, -1, sizeof head);
		memset(to, 0, sizeof to);
		memset(ne, 0, sizeof ne);
		memset(fa, 0, sizeof fa);
		memset(dep, 0, sizeof dep);
		idx = 1;

		scanf("%d", &n);
		for (int i = 1; i <= n; i ++ )
		{
			scanf("%d", &m);
			for (int v, j = 1; j <= m; j ++ )
			{
				scanf("%d", &v);
				to[idx] = v;
				ne[idx] = head[i];
				head[i] = idx ++ ;
				fa[v][0] = i;
			}
		}

		for (int i = 1; i <= n; i ++ )
		{
			if (!fa[i][0])
			{
				dfs(i);
				break;
			}
		}

		int x, y;
		scanf("%d", &q);
		printf("Case %d:\n", t);
		while (q -- )
		{
			scanf("%d%d", &x, &y);
			printf("%d\n", LCA(x, y));
		}
	}
	return 0;
}
2023/9/3 22:50
加载中...