社区讨论

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 条回复,欢迎继续交流。

正在加载回复...