dfs死循环求调
查看原帖
dfs死循环求调
1349423
jms23002楼主2025/1/14 16:03
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int t,h[N],e[2*N],idx,nxt[N],f[N][25],deep[N],n;
void add(int a,int b){
	e[idx++]=b;nxt[idx]=h[a];h[a]=idx;
}
void dfs(int u, int fa) {
	f[u][0] = fa; deep[u] = deep[fa] + 1;
	for(int i = 1; i <= 22; i++){
		f[u][i] = f[f[u][i-1]][i-1];
	}
	for(int i = h[u]; i!=-1; i = nxt[i]){
    	int v=e[i];
    	if(v!=fa){
    		deep[v]=deep[u]+1;
    		dfs(v,u);
		}
    }
}
int lca(int x,int y){
	if(deep[x]<deep[y]) swap(x,y);
	for(int i=22;i>=0;i--){
		if(deep[f[x][i]]>=deep[y]){
			x=f[x][i];
		}
	} 
	if(x==y) return y;
	for(int i=20;i>=0;i--){
		if(deep[f[x][i]]!=deep[f[y][i]]){
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main(){
	cin>>t;
	while(t--){
		idx=0;
		scanf("%d",&n);
		int root=n*(n+1)/2;
		int x,y;
		memset(f,-1,sizeof f);
		memset(deep,0,sizeof deep);
		memset(e,0,sizeof e);
		memset(h,0,sizeof h);
		memset(nxt,0,sizeof nxt);
		for(int i=1;i<n;i++){
			scanf("%d%d",&x,&y);
			add(x,y);
			root-=y;
		}
		
		scanf("%d%d",&x,&y);
		dfs(1,root);
		int ans=lca(x,y);
		printf("%d\n",lca);
	}
	return 0;
}
2025/1/14 16:03
加载中...