P3379 【模板】最近公共祖先(LCA)tarjan算法

tarjan算法求LCA
//tarjan算法
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
vector<int> tre[maxn];
struct node{
	int to;
	int id;
};
vector<node> query[maxn];
int ans[maxn],vis[maxn],fa[maxn];
int n,m,s;
int find(int x)
{
	if (fa[x]==x) return x;
	else return fa[x]=find(fa[x]);
}
void tarjan(int r)
{
	fa[r]=r;
	vis[r]=1;
	for (int i=0;i<tre[r].size();i++)
	{
		int v=tre[r][i];
		if (!vis[v])
		{
			tarjan(v);
			fa[v]=r;
		}
	}
	for (int i=0;i<query[r].size();i++)
	{
		node q=query[r][i];
		if (vis[q.to])
		{
			ans[q.id]=find(q.to);
		}
	}
} 
int main()
{
	cin>>n>>m>>s;
	for (int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		tre[x].push_back(y);
		tre[y].push_back(x);
	}
	for (int i=1;i<=m;i++)
	{
		int x,y;
		node qn;
		cin>>x>>y;
		qn.to=x;
		qn.id=i;
		query[y].push_back(qn);
		qn.to=y;
		query[x].push_back(qn);	
	}
	for (int i=1;i<=n;i++)	fa[i]=i;
	tarjan(s);
	for (int i=1;i<=m;i++)
	{
		cout<<ans[i]<<endl;
	}
} 

  

posted @ 2022-11-08 19:22  心悟&&星际  阅读(21)  评论(0编辑  收藏  举报