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); }