求助倍增LCA dfs打法两种为什么不一样?
查看原帖
求助倍增LCA dfs打法两种为什么不一样?
891956
TempestMiku楼主2023/4/25 21:38

求助,两种dfs打法为什么不同

inline void dfs(int now,int fa){//正确
	dep[now]=dep[fa]+1;
	fate[now][0]=fa;
	vis[now]=true;
	for(register int i=head[now];i;i=nxt[i]){
		int y=to[i];
		if(vis[y]) continue; 
			dfs(y,now);
	}
}

inline void dfs(int now,int fa,int depth){//错误
	dsu[now]=fa;
	dep[now]=depth;
	vis[now]=true;
	for(register int i=head[now];i;i=nxt[i]){
		int y=to[i];
		if(vis[y]) continue;
		dfs(y,now,depth+1);
	}
}

以这组数据为例、

1 2

2 4

2 3

4 5

图

如果用上面代码求lca(1,4)输出 0

如果用下面代码求lca(1,4)输出 1

#include<bits/stdc++.h>//下面dfs(正确)
#define int long long
using namespace std;
const int DistortedFate=543210; 
inline int read(){
	int f(1),x(0);
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
	for(;isdigit(ch);ch=getchar()) x=(x<<1)+(x<<3)+(ch^48);
	return f*x;
} 
inline void write(int x){
	if(x<0) putchar('-'),x=-x;
	if(x>9) write(x/10);
	putchar(x%10+'0');
	return ;
} 
int m,n,a[DistortedFate],k,t,dis[DistortedFate],vall[DistortedFate],dep[DistortedFate];
bool vis[DistortedFate];
char ch;
int fate[DistortedFate][23];
int head[DistortedFate<<1],nxt[DistortedFate<<1],to[DistortedFate<<1],tot;
inline void add(int x,int y){
	to[++tot]=y,nxt[tot]=head[x],head[x]=tot;
	return ;
}
inline void dfs(int now,int fa){
	dep[now]=dep[fa]+1;
	fate[now][0]=fa;
	vis[now]=true;
	for(register int i=head[now];i;i=nxt[i]){
		int y=to[i];
		if(vis[y]) continue; 
		dfs(y,now);
	}
}
inline int lca(int x,int y){
	if(dep[x]>dep[y]) swap(x,y);
	for(register int i=t;i>=0;i--){
		if(dep[fate[y][i]]>=dep[x]) y=fate[y][i];
	}//深度相同 
	if(x==y) return x;
	for(register int i=t;i>=0;i--){
		if(fate[x][i]!=fate[y][i]){
			x=fate[x][i];
			y=fate[y][i];
		}
	}
	return fate[x][0];
}
signed main(void){
	n=read();
	t=log2(n)+1;
	for(register int i=1;i<n;i++){
		register int asd,jkl;
		asd=read(),jkl=read();
		add(asd,jkl),add(jkl,asd);
	}
	dfs(1,0);
	for(register int j=1;j<=t;j++){
		for(register int i=1;i<=n;i++){
			fate[i][j]=fate[fate[i][j-1]][j-1];
		}
	}
	cout<<lca(1,4);
	return 0;
}
2023/4/25 21:38
加载中...