链接:https://ac.nowcoder.com/acm/problem/14248
来源:牛客网

题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。

思路:题目问两点之间路径为偶数的路径个数,那么我们知道两个深度为奇数的点之间的距离就是偶数,两个深度为偶数的点之间的距离也是偶数,所以,我们只需要计算出深度为奇数的点的个数以及深度为偶数的点的个数就好了。随意取一个点为根,在dfs的同时记录一下当前点的深度就ok了。最后注意一点:int太小了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long LL;
const int maxn=1e5+5;
const LL mod=1e9+7;
vector<int> ve[maxn];
int vis[maxn];
LL step1=0,step2=0;
void dfs(int i,int step) {
    vis[i]=1;
    if(step&1) step1++;
    else step2++;
    for(int j=0;j<ve[i].size();++j) {
        if(!vis[ve[i][j]]) {
            dfs(ve[i][j],step+1);
        }
    }
}
int main() {
//    cout<<"Accepted!\n";
    int n;
    cin>>n;
    int x,y;
    for(int i=1;i<n;++i) {
        cin>>x>>y;
        ve[x].push_back(y);
        ve[y].push_back(x);
    }
    memset(vis,0,sizeof(vis));
    dfs(1,0);
    cout<<step1*(step1-1)/2+step2*(step2-1)/2;
    return 0;
}