萌新刚学c艹,tarjan求lca,然后wa了一个点还一北分!?
查看原帖
萌新刚学c艹,tarjan求lca,然后wa了一个点还一北分!?
104745
YOU法克楼主2022/1/15 20:11

救命!!

#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;
	}
}
2022/1/15 20:11
加载中...