大概思路是求出 LCA ,再求出两个点到 LCA 的距离。
#include<cstdio>
#define N 100009
inline int read()
{
register int ret = 0;
register bool f = 1;
register char ch = getchar();
while (ch < '0' || ch > '9')
(ch == '-') ? f = 0 : 0, ch = getchar();
while (ch >= '0' && ch <= '9')
ret = (ret << 1) + (ret << 3) + (ch ^ 48), ch = getchar();
return f ? ret : -ret;
}
struct node
{
int v, nxt;
}e[N << 1];
int head[N], cnt = 1;
inline void add(int u, int v)
{
e[++ cnt].v = v, e[cnt].nxt = head[u], head[u] = cnt;
}
int top[N], dep[N], fa[N], siz[N], hson[N];
void dfs1(register int u, register int fath)
{
fa[u] = fath;
dep[u] = dep[fath] + 1;
siz[u] = 1;
register int i, v;
for (i = head[u];i;i = e[i].nxt)
{
v = e[i].v;
if (v != fath)
{
dfs1(v, u), siz[u] += siz[v];
if (siz[hson[u]] < siz[v])
hson[u] = v;
}
}
}
void dfs2(register int u, register int topf)
{
top[u] = topf;
if (!hson[u])
return;
dfs2(hson[u], topf);
register int i, v;
for (i = head[u];i;i = e[i].nxt)
{
v = e[i].v;
if (v != fa[u] && v != hson[u])
dfs2(v, v);
}
}
#define swap(a, b) (a ^= b, b ^= a, a ^= b)
inline int LCA(register int x, register int y)
{
while (top[x] != top[y])
{
if (dep[top[x]] < dep[top[y]])
swap(x, y);
x = fa[top[x]];
}
return dep[x] < dep[y] ? x : y;
}
int main()
{
register int n = read(), m = read(), rt = 1, i, u, v, x;
for (i = 1;i < n;++ i)
u = read(), v = read(), add(u, v), add(v, u);
dfs1(rt, 0);
dfs2(rt, rt);
for (i = 1;i <= m;++ i)
{
u = read(), v = read();
if (u != v)
{
x = LCA(u, v);
printf("%d\n", 1 + dep[u] - dep[x] + 1 + dep[v] - dep[x]);
}
else
puts("1");
}
return 0;
}