社区讨论

TLE求助

P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7rqerq
此快照首次捕获于
2025/11/21 02:32
4 个月前
此快照最后确认于
2025/11/21 02:32
4 个月前
查看原帖
CPP
#include<iostream>
#include<stdio.h>
using namespace std;
bool vis[500005];
int depth[500005];
int f[500005][25];
int head[500005];
int n,m,k,i,a,b,x,y;
int size;
struct edges
{
	int a,b;
	int f;
}edge[1000015];
void add(int a,int b)
{
	size++;
	edge[size].b=b;
	edge[size].f=head[a];
	head[a]=size;
}
void init()
{
	int j,i;
	for (j=1; (1<<j)<=n; j++) 
		for (i=1; i<=n; i++) 
		{
			f[i][j]=f[f[i][j-1]][j-1];
		}
	return ;
}
int lca(int x,int y)
{
	int i,j;
	if (depth[x]>depth[y]) swap(x,y);
	for (i=25; i>=0; i--) 
	{
		if (f[y][i]!=0 && depth[f[y][i]]>=depth[x]) y=f[y][i];
		
	}
	if (x==y) return x;
	for (i=25; i>=0; i--) 
		if (f[x][i]!=f[y][i] && f[x][i]!=0 && f[y][i]!=0) 
		{
			x=f[x][i];
			y=f[y][i];
		}
	return f[x][0];
}
int dfs(int x,int deep)
{
	depth[x]=deep;
	int i;
	for (i=head[x]; i!=0; i=edge[i].f)
	{
		if (depth[edge[i].b]==0) {f[edge[i].b][0]=x; dfs(edge[i].b,deep+1);}
	}
}
void work()
{
	f[k][0]=k;
	dfs(k,1);
}
int main()
{
	std::ios::sync_with_stdio(0);
	cin>>n>>m>>k;
	for (i=1; i<=n-1; i++) 
	{
		cin>>a>>b;
		add(a,b);
		add(b,a);
	}
	work();
	init();
	for (i=1; i<=m; i++)
	{
		cin>>x>>y;
		cout<<lca(x,y)<<endl;
	}
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...