就是很迷幻,LCA函数找公共祖先的时候,竟然能出祖先为0.。。。。。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int inf=0x3f3f3f3f;
typedef long long ll;
bool vis[maxn];
int deep[maxn];
int F[500005][20];
int n,m,s;
struct Edge
{
int from,to;
};
vector<Edge>edges;
vector<int>G[maxn];
void add(int from,int to)
{
edges.push_back({from,to});
int m=edges.size();
G[from].push_back(m-1);
}
void dfs(int u)
{
vis[u]=true;
for(int i=0;i<G[u].size();i++)
{
Edge e=edges[G[u][i]];
int v=e.to;
if(vis[v])
continue;
deep[v]=deep[u]+1;
F[v][0]=u;
dfs(v);
}
}
void ST()
{
for(int j=1;j<=20;j++)
{
for(int i=1;i<=n;i++)
F[i][j]=F[F[i][j-1]][j-1];
}
}
int LCA(int x,int y)
{
if(deep[x]>deep[y])
swap(x,y);
//cout<<x<<" "<<y<<endl;
for(int i=20;i>=0;i--)
{
if(deep[F[y][i]]>=deep[x])
y=F[y][i];
}
//cout<<x<<" "<<y<<endl;
if(x==y)
return x;
for(int i=20;i>=0;i--)
{
if(F[x][i]!=F[y][i])
{
x=F[x][i];
y=F[y][i];
}
}
// cout<<x<<endl;
return F[x][0];
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
memset(vis,false,sizeof(vis));
cin>>n>>m>>s;
for(int i=0;i<n-1;i++)
{
int x,y;
cin>>x>>y;
add(x,y);
add(y,x);
}
deep[s]=0;
dfs(s);
while(m--)
{
int a,b;
cin>>a>>b;
cout<<LCA(a,b)<<endl;
}
}