思路:
在LCA函数中如果将x与y放置到同一深度时,若x==y则x与y有祖宗关系且deep较小的为祖宗,否则无祖宗关系
#include<cstdio> #include<iostream> #include<vector> using namespace std; const int maxn = 40010; inline void qread(int &x){ x = 0; register int ch = getchar(), flag = 0; while(ch < '0' || ch > '9') { if(ch == '-') flag = 1; ch = getchar(); } while(ch >= '0' && ch <= '9'){ x = 10 * x + ch - 48; ch = getchar(); } if(flag) x = -x; } int n, m, rt = 1; vector<int> G[maxn]; vector<int> W[maxn]; int llog[maxn]; int deep[maxn]; int f[maxn][30]; int g[maxn]; inline void init(){ qread(n); for(int i=1; i<=n; ++i){ int x, y; qread(x), qread(y); if(y == -1){ rt = x; continue; } G[x].push_back(y); G[y].push_back(x); } qread(m); deep[rt] = 1; } void dfs(int x){ for(int i=0; i<G[x].size(); ++i) if(!deep[G[x][i]]){ f[G[x][i]][0] = x; deep[G[x][i]] = deep[x] + 1; dfs(G[x][i]); } } inline void STtree(){ for(int i=2; i<=maxn - 10; ++i) llog[i] = llog[i >> 1] + 1; for(int j = 1; j <= llog[maxn - 10]; ++j) for(int i=1; i<=maxn - 10; ++i) f[i][j] = f[f[i][j-1]][j-1]; } inline int LCA(int x, int y){ if(x == y) return x; if(deep[x] < deep[y]) swap(x, y); for(int j = llog[n]; j>=0; --j) if(deep[f[x][j]] >= deep[y]) x = f[x][j]; if(x == y) return 1; for(int j = llog[n]; j>=0; --j) if(f[x][j] != f[y][j]){ x = f[x][j]; y = f[y][j]; } return 2; } int main(void){ init(); dfs(rt); STtree(); while(m--){ int x, y; qread(x), qread(y); int z = LCA(x, y); if(z == 2) printf("0\n"); else printf("%d\n", (deep[x] > deep[y]) + 1); } }