社区讨论
Tarjan LCA 本机无事 提交全紫 求条
P3379【模板】最近公共祖先(LCA)参与者 3已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @mhjt2r84
- 此快照首次捕获于
- 2025/11/04 08:03 4 个月前
- 此快照最后确认于
- 2025/11/04 08:03 4 个月前
CPP
#include <iostream>
#include <vector>
using namespace std;
const int MAXN = 5e5 + 1;
int n, m, s, fa[MAXN], qa[MAXN], qb[MAXN], ans[MAXN];
vector<int> dic[MAXN], g[MAXN];
bool vis[MAXN];
int find(int x){return fa[x] ? fa[x] = find(fa[x]) : x;}
int merge(int x, int y){fa[find(x)] = find(y);}
void tarjan(int u, int f){
vis[u] = true;
for (int v : g[u]){
if (v == f) continue;
tarjan(v, u);
merge(v, u);
}
for (int v : dic[u]){
if (qa[v] == qb[v]) ans[v] = u;
if (vis[qa[v]] && vis[qb[v]]){
if (qa[v] == u) ans[v] = find(qb[v]);
else ans[v] = find(qa[v]);
}
}
}
int main(){
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 <= m; i++){
int a, b;
cin >> a >> b;
qa[i] = a, qb[i] = b;
dic[a].push_back(i);
dic[b].push_back(i);
}
tarjan(s, 0);
for (int i = 1; i <= m; i++){
cout << ans[i] << '\n';
}
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...