这题也是一种思维吧(可能最近老了,思维不好),不过还可以
解题思路:
- 首先我们思考,如何让他们的距离为偶数呢,那么如果距离一个点的距离是偶数,那么距离为偶数的点的距离都是偶数
- 如果都是奇数,那么他们的距离也是偶数。
- 所以我们要求出他们的点的距离,距离就随便选一个点为标准就行,然后对于偶数和奇数点,我们都Cn2就ok
- 记得开long long
代码:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N = 100010, M = 200010;
int h[N], ne[M], e[M], idx;
int dist[N];
bool st[N];
void add(int x, int y){
e[idx] = y, ne[idx] = h[x], h[x] = idx++;
}
void dfs(int x){
st[x] = true;
for (int i = h[x]; i != -1; i = ne[i]){
int j = e[i];
if (!st[j]){
st[j] = true;
dist[j] = dist[x] + 1;
dfs(j);
}
}
}
int main(){
int n;
scanf("%d",&n);
memset(h,-1,sizeof h);
for (int i = 0; i < n - 1;i ++){
int x, y;
scanf("%d%d",&x,&y);
add(x,y), add(y,x);
}
dfs(1);
long long a = 0, b = 0;
for (int i = 1; i <= n; i ++){
if (dist[i] % 2){
a ++;
}
else{
b ++;
}
}
long long res = 0;
res += (a - 1) * a / 2 + (b - 1) * b / 2;
printf("%lld\n",res);
return 0;
}