P3379 Tarjan过不了了?
查看原帖
P3379 Tarjan过不了了?
946432
xudabai2009楼主2024/7/31 10:47
#include <bits/stdc++.h>
using namespace std;
const int N=500005;
int fa[N],head[N],cnt,head_query[N],cnt_query,ans[N];
bool vis[N];
struct Edge{
	int v,next,num;
}edge[N*2],query[N*2];
void init(){
	for(int i=0;i<2*N;++i){
		edge[i].next=-1;head[i]=-1;
		query[i].next=-1;head_query[i]=-1;
	}
	cnt=0;cnt_query=0;
}
void addedge(int u,int v){
	edge[cnt].v=v;
	edge[cnt].next=head[u];
	head[u]=cnt++;
}
void add_query(int x,int y,int num){
	query[cnt_query].v=y;
	query[cnt_query].num=num;
	query[cnt_query].next=head_query[x];
	head_query[x]=cnt_query++;
}
int find_set(int x){
	return fa[x]==x?x:find_set(fa[x]);
}
void tarjan(int x){
	vis[x]=true;
	for(int i=head[x];i!=-1;i=edge[i].next){
		int y=edge[i].v;
		if(!vis[y]){
			tarjan(y);
			fa[y]=x;
		}
	}
	for(int i=head_query[x];i!=-1;i=query[i].next){
		int y=query[i].v;
		if(vis[y]) ans[query[i].num]=find_set(y);
	}
}
int main(){
	init();
	memset(vis,0,sizeof(vis));
	int n,m,root;
	cin>>n>>m>>root;
	for(int i=1;i<n;i++){
		fa[i]=i;
		int u,v;
		cin>>u>>v;
		addedge(u,v);
		addedge(v,u);
	}
	fa[n]=n;
	for(int i=1;i<=m;++i){
		int a,b;
		cin>>a>>b;
		add_query(a,b,i);
		add_query(b,a,i);
	}
	tarjan(root);
	for(int i=1;i<=m;++i) cout<<ans[i]<<endl;
	return 0;
}

求大佬

2024/7/31 10:47
加载中...