Tarjan求LCA求条
查看原帖
Tarjan求LCA求条
1149762
liujinxv123楼主2024/8/25 19:50

如题,WA 13 号测试点,大佬帮助

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
vector<int> e[N];
vector<int> query[N],query_id[N];
int d[N],v[N],ans[N],father[N];
int n,m,s;
int find(int x){
	if(father[x] == x) return x;
	return father[x] = find(father[x]);
}
void tarjan(int x){
	v[x] = 1;
	for(int i = 0;i < e[x].size();i ++){
		int y = e[x][i];
		if(v[y]) continue;
		d[y] = d[x] + 1;
		tarjan(y);
		father[y] = x;
	}
	for(int i = 0;i < query[x].size();i ++){
		int y = query[x][i],id = query_id[x][i];
		if(v[y] == 2){
			int LCA = find(y);
			ans[id] = LCA;
		}
	}
	v[x] = 2;
}
void solve(){
	cin >> n >> m >> s;
	for(int i = 1;i <= n;i ++){
		d[i] = 0;
		v[i] = 0;
		father[i] = i; 
		e[i].clear();
		query[i].clear();
		query_id[i].clear();
	}
	for(int i = 1;i < n;i ++){
		int u,v;
		cin >> u >> v;
		e[u].push_back(v);
		e[v].push_back(u);
	}
	for(int i = 1;i <= m;i ++){
		int x,y;
		cin >> x >> y;
		query[x].push_back(y);
		query_id[x].push_back(i);
		query[y].push_back(x);
		query_id[y].push_back(i);
	}
	tarjan(s);
	for(int i = 1;i <= m;i ++) cout << ans[i] << "\n";
	return;
}
int main(){
	int T = 1;
	while(T --) solve();
	return 0;
}
2024/8/25 19:50
加载中...