Tarjan+并查集 TLE两个Substack2的点
查看原帖
Tarjan+并查集 TLE两个Substack2的点
1053112
LinearXeno楼主2024/11/3 08:36

是不是卡掉的?

#include<bits/stdc++.h>
using namespace std;
int n,m,ut,vt,root;
long long deep[500010],dp[500010][25];
vector<int> g[500010];
void dfs(int u,int fa) {
	deep[u] = deep[fa] + 1;
	dp[u][0] = fa;
	for (int i = 1;(1 << i) <= deep[u];i ++)
		dp[u][i] = dp[dp[u][i - 1]][i - 1];
	for (int i = 0;i < g[u].size();i ++) {
		int v = g[u][i];
		if (v != fa) dfs(v,u);
	}
	return;
}
int LCA(int x,int y) {
	if (deep[x] < deep[y]) swap(x,y);
	
	for (int i = 19;i >= 0;i --)
		if (deep[x] - (1 << i) >= deep[y]) x = dp[x][i]; //循环结束后一定有deep[x] - (1 << i) == deep[y]
	if (x == y) return x;
	
	for (int i = 19;i >= 0;i --)
		if (dp[x][i] != dp[y][i]) {
			x = dp[x][i];
			y = dp[y][i];
		} //循环结束后一定有x != y,但是一定有fa[x] == fa[y] 
	return dp[x][0];
}
int main() {
	scanf("%d%d%d",&n,&m,&root);
	for (int i = 1;i <= n - 1;i ++) {
		scanf("%d%d",&ut,&vt);
		g[ut].push_back(vt);
		g[vt].push_back(ut);
	}
	dfs(root,0);
	for (int i = 1;i <= m;i ++) {
		scanf("%d%d",&ut,&vt);
		printf("%d\n",LCA(ut,vt));
	}
	return 0;
}

2024/11/3 08:36
加载中...