社区讨论

萌新刚学c艹,tarjan求lca,然后wa了一个点还一北分!?

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

讨论操作

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

当前回复
5 条
当前快照
1 份
快照标识符
@lo9j6ih7
此快照首次捕获于
2023/10/28 12:17
2 年前
此快照最后确认于
2023/10/28 12:17
2 年前
查看原帖
救命!!
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N = 5e5+10;
struct E{
	int next,to,num;
}e1[N*2],e2[N*2];
int head1[N],head2[N];
int cnt1,cnt2,top;
int n,m,st,fa[N],vis[N];
int ans[N];

void add1(int u,int to){
	e1[++cnt1].next =head1[u];
	e1[cnt1].to =to;
	head1[u]=cnt1;
}

void add2(int u,int to){
	e2[++cnt2].next =head2[u];
	e2[cnt2].to =to;
	e2[cnt2].num =top;
	head2[u]=cnt2;
}

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

void tarjan(int u,int father){
	for(int i=head1[u];i;i=e1[i].next ){
		int v=e1[i].to ;
		if(v==father)continue;
		tarjan(v,u);
		int tx=find(u);
		int ty=find(v);
		fa[ty]=tx;
		vis[v]=1;
	}
	for(int i=head2[u];i;i=e2[i].next ){
		int v=e2[i].to ;
		if(v==father)continue;
		if(vis[v]){
			ans[e2[i].num ]=find(v);
		}
	}
}

int main(){
//	freopen("123.txt","r",stdin); 
	cin>>n>>m>>st;
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<n;i++){
		int x,y;
		cin>>x>>y;
		add1(x,y);
		add1(y,x);
	}
	for(top=1;top<=m;top++){
		int x,y;
		cin>>x>>y;
		add2(x,y);
		add2(y,x);
	}
	tarjan(st,st);
	for(int i=1;i<=m;i++){
		cout<<ans[i]<<endl;
	}
}

回复

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

正在加载回复...