https://ac.nowcoder.com/acm/problem/14248

题意:

一棵树,求所有距离为偶数的点对

解法:

由于在树上,假设两点分别为 u,v,那么
无论   是奇数还是偶数, 一定是偶数
所以只需要  是偶数即可
所以任取两个深度为奇数/偶数的点他们之间的距离都是偶数。
任取一个点 dfs 求深度,然后统计奇数/偶数深度的点的个数即可。

代码:

#include <bits/stdc++.h>
#define ll long long
#define sc scanf
#define pr printf
using namespace std;
const int MAXN = 1e5 + 5;
struct edge
{
	int to;
	int nex;
}e[MAXN * 2];
int head[MAXN], tot;
void init()
{
	memset(head, -1, sizeof(head));
	tot = 1;
}
void add(int a, int b)
{
	e[tot] = edge{ b,head[a] };
	head[a] = tot++;
}
ll q, w;
int deep[MAXN];
void dfs(int u, int fa)
{
	deep[u] = deep[fa] + 1;
	if (deep[u] & 1)
		q++;
	else
		w++;
	for (int i = head[u]; i + 1; i = e[i].nex)
	{
		int v = e[i].to;
		if (v == fa)
			continue;
		dfs(v, u);
	}
}
int main()
{
	init();
	int n;
	sc("%d", &n);
	for (int i = 1; i < n; i++)
	{
		int a, b;
		sc("%d%d", &a, &b);
		add(a, b);
		add(b, a);
	}
	dfs(1, 0);
	ll ans = q * (q - 1) / 2 + w * (w - 1) / 2;
	pr("%lld\n", ans);
}