太难啦 哪里错了 输出全是0 救命
查看原帖
太难啦 哪里错了 输出全是0 救命
423270
l17663843890楼主2021/4/23 19:46
#include <iostream>
using namespace std;
const int N=1e7;
int cnt,n,m,s,vis[N],head[N],d[N],fa[N][22],log2[N];
struct node
{
	int to,nex;
}e[N];
void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
 } 
 void dfs(int cur,int father)
 {

 	fa[cur][0]=father;
 	d[cur]=d[father]+1;
 	for(int i=1;i<=log2[d[cur]];i++)
 		fa[cur][i]=fa[fa[cur][i-1]][i-1];
 	for(int i=head[cur];i;i=e[i].nex)
 		if(e[i].to!=father)
 		dfs(e[i].to,cur);
 }
 
 int LCA(int a,int b)
 {
 	if(d[a]>d[b])
 		swap(a,b);
 	while(d[a]!=d[b])
 		b=fa[b][log2[d[b]-d[a]]];
 	if(a==b)
 	return a;
 	for(int k=log2[d[a]];k>=0;k--)
 	if(fa[a][k]!=fa[b][k])
 	a=fa[a][k],b=fa[b][k];
 	return fa[a][0];
 }
 main()
 {
 
 	cin>>n>>m>>s;
 		for(int i=2;i<=n;i++)
 		log2[i]=log2[i/2]+1;
 		for(int i=1;i<n;i++)
 		{
 			int u,v;
 			cin>>u>>v;
 			add(u,v);
 			add(v,u);
		 }
		 for(int i=1;i<=m;i++)
		 {
		 	int a,b;
		 	cin>>a>>b;
		 	cout<<LCA(a,b)<<endl;
		 }
 }
2021/4/23 19:46
加载中...