LCA之tarjan模板

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
const int maxx=500010;
int be[maxx],ne[maxx*2],to[maxx*2],e=0;
int bee[maxx],nee[maxx*2],too[maxx*2],w[maxx*2],ee=0;
int ans[maxx],fa[maxx],root;
bool p[maxx];
void ad(int x,int y){
	to[++e]=y;
	ne[e]=be[x];
	be[x]=e;
}
void add(int x,int y,int z){
	too[++ee]=y;
	nee[ee]=bee[x];
	bee[x]=ee;
	w[ee]=z;
}
int find(int x){
	return fa[x]=fa[x]==x?x:find(fa[x]);
}
void dfs(int id){
	p[id]=1;
	fa[id]=id;
	for(int u=be[id];u;u=ne[u]){
		int go=to[u];
		if(!p[go]){
			dfs(go);
			fa[go]=id;
		}
	}
	for(int u=bee[id];u;u=nee[u]){
		int go=too[u];
		if(p[go])
			ans[w[u]]=find(go);
	}
}
int read(){  
    char x;  
    while((x = getchar()) > '9' || x < '0') ;  
    int u = x - '0';  
    while((x = getchar()) <= '9' && x >= '0') u = u * 10 + x - '0';  
    return u;  
}  
int main(){
#ifndef ONLINE_JUDDGE
	freopen("input.in","r",stdin);
	freopen("output.out","w",stdout);
#endif
	int i,j,k,m,n;
	n=read();
	m=read();
	root=read();
	for(i=1;i<n;i++){
		j=read();
		k=read();
		ad(j,k);
		ad(k,j);
		}
	for(i=1;i<=m;i++){
		j=read();
		k=read();
		add(j,k,i);
		add(k,j,i);
	}
	dfs(root);
	for(i=1;i<=m;i++)
		printf("%d\n",ans[i]);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值