社区讨论
为什么
P3379【模板】最近公共祖先(LCA)参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @m2oaugqb
- 此快照首次捕获于
- 2024/10/25 13:36 去年
- 此快照最后确认于
- 2025/11/04 16:14 4 个月前
这个代码是 分
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 条回复,欢迎继续交流。
正在加载回复...