急,最后两个TLE。。。。
查看原帖
急,最后两个TLE。。。。
555110
icehellfire楼主2022/7/19 21:40
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define INF 0x3f3f3f
int son[INF],fa[INF],size[INF],dep[INF],cnt,head[INF];
int top[INF],n,m,q;
int read()
{
	int x = 0;
	char y = getchar();
	while(y<'0'||y>'9') y = getchar();
	while(y>='0'&&y<='9')
	{
		x = x*10 + y -'0';
		y = getchar();
	}
	return x;
}
struct edge{
	int v;
	int next;
}e[INF];
void add(int u,int v)
{
	e[++cnt].v = v;
	e[cnt].next = head[u];
	head[u] = cnt;
	return;
}
void dfs(int u,int f)
{
	size[u] = 1;
	dep[u] = dep[f] + 1;
	for(int i = head[u];i;i = e[i].next)
	if(e[i].v != f)
	{
		fa[e[i].v] = u;
		dfs(e[i].v,u);
		size[u] += size[e[i].v];
		if(size[e[i].v] > size[son[u]])
		{
			son[u] = e[i].v;
		}
	}
	return;
 } 
void dfs2(int x,int tp)
{
	top[x] = tp;
	if(son[x]) dfs2(son[x],tp);
	for(int i=head[x];i;i = e[i].next)
	{
		if(e[i].v!=fa[x]&&e[i].v != son[x])
		{
			dfs2(e[i].v,e[i].v);
		}
	}
	return;
}
int lca(int x,int y)
{
	while(top[x] != top[y])
	{
		if(dep[top[x]] < dep[top[y]]){
			swap(x,y);
		}
		x = fa[x];
	}
	return dep[x]<dep[y]?x:y;
}
int main()
{
	
	n = read(),q = read(),m = read(); 
	for(int i=1;i<n;i++){
		int x;int y;
		x = read(),y = read();
		add(x,y);
		add(y,x);
	}
	dep[m] = -1;
	dfs(m,m);
	dfs2(m,m);
	for(int i=1;i<=q;i++)
	{
		int x,y;
		x = read(),y = read();
		cout<<lca(x,y)<<endl;
	}
	return 0;
 } 
2022/7/19 21:40
加载中...