样例能过 AC2个点 求调!!
查看原帖
样例能过 AC2个点 求调!!
1217047
A_Xy楼主2024/3/7 00:50
#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int N,M,S;//节点  询问次数 根节点序列号 
vector<int> tree[500005];
int d[500005];
int f[500005][22];


void bfs(){
	queue<int> q;
	q.push(S);
	d[S] = 1;
	while(!q.empty()){
		int node = q.front();
		q.pop();
		for(int i = 0;i<tree[node].size();i++){
			int cnode = tree[node][i];
			if(d[cnode])continue;
			
			d[cnode] = d[node]+1;
			f[cnode][0] = node;
			for(int k = 20;k>=1;k--){
				f[cnode][k] = f[f[cnode][k-1]][k-1];
			}
			q.push(cnode);
		}
	}
	
	
}
int lca(int x,int y){
	if(d[x] > d[y])swap(x,y);//保证y最深 
	for(int k = 20;k>=0;k--){
		if(d[f[y][k]] >= d[x]){
			y = f[y][k];
		}
	}//到同一深度
	if(x == y) return x;
	for(int k = 20;k>=0;k--){
		if(f[y][k] != f[x][k]){
			y = f[y][k];
			x = f[x][k];
		}
	} 
	return f[x][0];
}
int main(){
	cin >> N >> M >> S;
	for(int i = 1;i<=N-1;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		tree[x].push_back(y);
		tree[y].push_back(x);
	} 
	//dfs(S,0,1);
	bfs();
	for(int i = 1;i<=M;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",lca(a,b));
	}

	return 0;
}
2024/3/7 00:50
加载中...