社区讨论

为什么

P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@m2oaugqb
此快照首次捕获于
2024/10/25 13:36
去年
此快照最后确认于
2025/11/04 16:14
4 个月前
查看原帖
这个代码是 00
CPP
#include<bits/stdc++.h>
#define qwq ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const int N = 5e5 + 5;

int n , m , s , lg[N] , d[N] , fa[N][30];
vector<int> g[N];

void dfs(int s , int f){
	fa[s][0] = f , d[s] = d[f] + 1;
	for(int i = 1 ; (1 << i) <= d[s] ; ++ i){
		fa[s][i] = fa[fa[s][i - 1]][i - 1];
	}
	for(int i = 0 ; i < g[s].size() ; i ++){
		int t = g[s][i];
		if(t != f) dfs(t , s);
	}
}
int lca(int x , int y){
	if(d[x] < d[y]) swap(x , y);
	
	while(d[x] != d[y]) x = fa[x][lg[d[x] - d[y]] - 1];
	if(x == y) return x;
	for(int k = lg[d[x]] ; k >= 0 ; -- k){
		if(fa[x][k] != fa[y][k]){
			x = fa[x][k] , y = fa[y][k];
		}
	}
	return fa[x][0];
}

int main(){    qwq
	cin >> n >> m >> s;
	
	for(int i = 1 ; i < n ; i ++){
		int x , y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for(int i = 1 ; i <= N ; ++ i){
		lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
	}
	dfs(s , 0);
	for(int i = 1 ; i <= m ; i ++){
		int x , y;
		cin >> x >> y;
		cout << lca(x , y) << '\n';
	}
	return 0;
}
但是只要把 dfs 的 s 形参名字改成 x 就对了,如下
CPP
#include<bits/stdc++.h>
#define qwq ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;

const int N = 5e5 + 5;

int n , m , s , lg[N] , d[N] , fa[N][30];
vector<int> g[N];

void dfs(int x , int f){
	fa[x][0] = f , d[x] = d[f] + 1;
	for(int i = 1 ; (1 << i) <= d[x] ; ++ i){
		fa[x][i] = fa[fa[x][i - 1]][i - 1];
	}
	for(int i = 0 ; i < g[x].size() ; i ++){
		int t = g[x][i];
		if(t != f) dfs(t , x);
	}
}
int lca(int x , int y){
	if(d[x] < d[y]) swap(x , y);
	
	while(d[x] != d[y]) x = fa[x][lg[d[x] - d[y]] - 1];
	if(x == y) return x;
	for(int k = lg[d[x]] ; k >= 0 ; -- k){
		if(fa[x][k] != fa[y][k]){
			x = fa[x][k] , y = fa[y][k];
		}
	}
	return fa[x][0];
}

int main(){    qwq
	cin >> n >> m >> s;
	
	for(int i = 1 ; i < n ; i ++){
		int x , y;
		cin >> x >> y;
		g[x].push_back(y);
		g[y].push_back(x);
	}
	for(int i = 1 ; i <= n ; ++ i){
		lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
	}
	dfs(s , 0);
	while(m --){
		int x , y;
		cin >> x >> y;
		cout << lca(x , y) << '\n';
	}
	return 0;
}
为什么 ? ? ? 参数 s 应该把全局变量 s 覆盖了吧 , 问一下qwq

回复

3 条回复,欢迎继续交流。

正在加载回复...