0pts求助
查看原帖
0pts求助
701221
Chr0n1CleC楼主2022/12/20 12:58

大概思路是求出 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;
}
2022/12/20 12:58
加载中...