萌新刚学树剖LCA求助!
查看原帖
萌新刚学树剖LCA求助!
184500
hanzhongtlx楼主2020/4/28 22:41

过了是过了,然而发现跑的很慢,就拿小号试了一发题解(qwq,这个不要举报了吧),然而时间是我的一半左右,那里写丑了?

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;

#define read(x) scanf("%d",&x)
#define MAXN 500005

int top[MAXN],dep[MAXN],son[MAXN],vis[MAXN],f[MAXN],tot[MAXN];
struct node
{
	int to,nxt;
}e[MAXN<<1];
int head[MAXN],cnt=0;
int n,m,root,l,r;

void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].nxt=head[u];
	head[u]=cnt;
}

int dfsa(int cur,int deep)
{
	vis[cur]=1;
	dep[cur]=deep;
	tot[cur]=1;
	son[cur]=0;
	int maxn=0;
	for(int i=head[cur];i;i=e[i].nxt)
	{
		int j=e[i].to;
		if(vis[j]) continue;
		f[j]=cur;
		int now=dfsa(j,deep+1);
		if(now>maxn) maxn=now,son[cur]=j;
		tot[cur]+=now;
	}
	return tot[cur];
}

void dfsb(int cur,int topf)
{
	vis[cur]=1;
	top[cur]=topf;
	if(son[cur]) dfsb(son[cur],topf);
	for(int i=head[cur];i;i=e[i].nxt)
	{
		int j=e[i].to;
		if(vis[j]) continue;
		dfsb(j,j);
	}
	return;
}

int lca(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		x=f[top[x]];
	}
	return dep[x]<dep[y]?x:y;
}

int main()
{
	read(n),read(m),read(root);
	for(int i=1;i<n;i++)
	{
		read(l),read(r);
		add(l,r),add(r,l);
	}
	memset(vis,0,sizeof(vis));
	f[root]=root;
	dfsa(root,1);
	memset(vis,0,sizeof(vis));
	dfsb(root,root);
	for(int i=1;i<=m;i++)
	{
		read(l),read(r);
		printf("%d\n",lca(l,r));
	}	
	return 0; 
}
2020/4/28 22:41
加载中...