poj1330 Nearest Common Ancestors(lca模板题)

题目

T组样例,N(2<=N<=1e4)个节点,

给出N-1条有向边u->v后,询问一组u和v的lca

思路来源

《挑战程序竞赛》P330-331

题解

lca裸题,用RMQ+ST就好了,其实倍增也是应该掌握的

由于只有一组询问,所以预处理欧拉序dfn

id用来记录dfs序中第一次访问的时间戳

不妨id[u]

心得

大一选拔赛的时候当时不会lca,CCCC的时候还不会lca

现在敲了几道RMQ的ST题之后,终于会魔改ST的板子存下标了

白书的板子太简洁,有时实在不是一件好事啊……

代码

#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=2e4+10;
vectorE[maxn];
int T,n,u,v;
int dfn[2*maxn],tot;//欧拉序 
int dep[2*maxn];//各顶点深度 
int id[maxn];//各顶点第一次出现下标 
int dp[maxn][20];
bool vis[maxn];
void dfs(int u,int fa,int d)
{
	id[u]=++tot;
	dfn[tot]=u;
	dep[tot]=d;
	for(int i=0;i

 

你可能感兴趣的:(poj1330 Nearest Common Ancestors(lca模板题))