题意:求一棵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;
}