社区讨论

re求救

P3379【模板】最近公共祖先(LCA)参与者 6已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@mi6nm1um
此快照首次捕获于
2025/11/20 07:49
4 个月前
此快照最后确认于
2025/11/20 07:49
4 个月前
查看原帖
本地没re啊 线上全re
CPP
#include<iostream>
#include<cstdio>
#define N 500005
using namespace std;

int n,m,root,cntE,cntQ=1,f[N+5],heade[N+5],headq[N+5];

bool vis[N+5];

struct Edge{
	int nxt,to;
}edge[N<<1+5];

struct Question{
	int nxt,to,LCA;
}question[N<<1+5];

int find(int x){
	if(x==f[x])return x;
	return f[x]=find(f[x]);
} 

void addedge(int u,int v){
	edge[++cntE]=(Edge){heade[u],v},heade[u]=cntE;
	edge[++cntE]=(Edge){heade[v],u},heade[v]=cntE;
}

void addquestion(int u,int v){
	question[++cntQ]=(Question){headq[u],v},headq[u]=cntQ;
	question[++cntQ]=(Question){headq[v],u},headq[v]=cntQ;
}

void dfs(int o){
	vis[f[o]=o]=1;;
	for(int i=heade[o];i;i=edge[i].nxt){
		if(!vis[edge[i].to]){
			dfs(edge[i].to);
			f[edge[i].to]=o;
		}
	}
	for(int i=headq[o];i;i=question[i].nxt){
		if(vis[question[i].to]){
			question[i^1].LCA=question[i].LCA=find(question[i].to);
		}
	}
}

int main(){
	scanf("%d%d%d",&n,&m,&root);
	for(int i=1;i<n;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		addedge(x,y);
	}
	for(int i=1;i<=m;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		addquestion(x,y);
	}
	dfs(root);
	for(int i=1;i<=m;i++)printf("%d\n",question[i<<1].LCA);
	return 0;
}

回复

8 条回复,欢迎继续交流。

正在加载回复...