考察知识点:树上 DFS
设节点 i
到根节点 1
的距离为节点 i
的长度,记为 dist[i]
,则有以下结论:
- 长度为偶数的两个节点之间的路径长度一定为偶数
- 长度为奇数的两个节点之间的路径长度也一定为偶数
因此本题我们只需要遍历整棵树,记录每个节点的长度,然后统计长度为偶数的节点数量 和长度为奇数的节点数量
,长度为偶数的路径的数量即为
。
时间复杂度:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
const int N = 1e6 + 5;
vi edges[N];
int dist[N];
void dfs(int u, int from)
{
dist[u] = dist[from] + 1;
for (int v : edges[u])
if (v != from)
dfs(v, u);
}
void solve()
{
int n;
cin >> n;
for (int i = 0; i < n - 1; i++)
{
int x, y;
cin >> x >> y;
edges[x].push_back(y);
edges[y].push_back(x);
}
dfs(1, 0);
ll cnt[2] = {0, 0};
for (int i = 1; i <= n; i++)
cnt[dist[i] % 2]++;
cout << cnt[0] * (cnt[0] - 1) / 2 + cnt[1] * (cnt[1] - 1) / 2 << endl;
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
int t = 1;
// cin >> t;
while (t--)
solve();
return 0;
}