题意:求一棵n个点的树中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
思路:奇+奇=偶,偶+偶=偶
所以用跑一遍dfs求出奇数深度结点的数目x和偶数深度结点的数目y
再计算偶数路径数=(x(x-1)+y(y-1))/2;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 998244353
int n;
vector<int> g[200005];
struct w
{
int x, y;
};
struct w dfs(int v,int f)
{
struct w w1, w2;
w1.x=0;
w1.y=1;
for(int i=0; i<g[v].size(); i++)
{
if(g[v][i]==f)
{
continue;
}
w2=dfs(g[v][i],v);
w1.x+=w2.y;
w1.y+=w2.x;
}
return w1;
}
int main()
{
scanf("%d",&n);
for(int i=0; i<n-1; i++)
{
int s, e, cost;
scanf("%d %d",&s,&e);
g[s].push_back(e);
g[e].push_back(s);
}
struct w w=dfs(1,-1);
ll z=((ll)w.x*(w.x-1))+((ll)w.y*(w.y-1));
printf("%lld\n",z/2);
return 0;
}

京公网安备 11010502036488号