代码很好理解(我觉得是)好吧,这么渣的代码根本就是我自己写的(ノ=Д=)ノ┻━┻
LCA倍增代码
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#define maxn 10010
#define lg 20
#define inf 0xefffffff
using namespace std;
vector<int> g[maxn];
int f[maxn][lg + 5], d[maxn], n;
void dfs(int x)
{
d[x] = d[f[x][0]] + 1;
for (int i = 1; i <= lg; i++)
f[x][i] = f[f[x][i - 1]][i - 1];
for (int i = 0; i < g[x].size(); i++)
dfs(g[x][i]);
return ;
}
inline void init()
{
scanf("%d", &n);
for (int i = 0; i < maxn; i++)
g[i].clear();
memset(f,0,sizeof(f));
memset(d,0,sizeof(d));
int fr, to;
for (int i = 1; i < n; i++)
{
scanf("%d %d", &fr, &to);
g[fr].push_back(to);
f[to][0] = fr;
}
for (int i = 1; i <= n; i++)
if (!f[i][0])
{
dfs(i);
break;
}
return ;
}
inline int lca(int x, int y)
{
if (d[x] < d[y])
swap(x, y);
int dt = d[x] - d[y];
for (int i = lg; i >= 0; i--)
if ((1 << i) & dt)
x = f[x][i];
if (x == y)
return x;
for (int i = lg; i >= 0; i--)
if (f[x][i] != f[y][i])
x = f[x][i], y = f[y][i];
return f[x][0];
}
int main()
{
int T;
scanf("%d", &T);
int fr, to;
while (T--)
{
init();
scanf("%d %d", &fr, &to);
printf("%d\n", lca(fr, to));
}
return 0;
}