题目大意
给个树,每次询问给出3个点a,b,c,询问a到b的路径与b到c的路径之间重合的点的个数
正解
lca不多说啥了,统计答案就是分类讨论咯(这里本人似乎讨论的重复些,读者也可以有自己的方法,所以本人自己的方法也便不解释了),另外这题卡栈(就是说dfs(递归)是系统存储的,这道题递归的太深导致系统的存储空间爆掉了),所以要打人工栈(也就是bfs)
#include<cstdio>
#include<iostream>
#include<cmath>
#define N 200007
using namespace std;
int n,q,num,cnt,f[N][20],dep[N],head[N],ans,d[N];
struct tree{
int to,nxt;
}e[N<<1];
void add(int u,int v){
//链式前向星
e[++cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void dfs(){
//用人工栈
int t=1,h=0;
d[t]=1;
while(h<t){
int x=d[++h