Treepath(牛客4.15 水题)

Treepath

题目链接
题解链接

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

分析:
在一棵树上,两个点之间的路径只有一条。求长度为偶数的路径,偶数层到偶数层的路径长度是偶数,奇数层到奇数层是偶数,分别求出奇数层点的个数 o d d odd ,偶数层点的个数 e v e n even ,任意从奇数层的点中选出两个点就有唯一的一条路径,那么总的路径数就是 C o d d 2 C_{odd}^2 ,同理偶数层的点是 C e v e n 2 C_{even}^2 。注意long long。

Code:

#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int n;
vector<int> e[N];
int odd, even; //奇 偶
void dfs(int c, int f, int deep)
{
    if (deep & 1) odd++;
    else even++;
    for (auto v : e[c])
    {
        if (v == f) continue;
        dfs(v, c, deep + 1);
    }
}
int main()
{
    ios::sync_with_stdio(false), cin.tie(nullptr);
    cin >> n;
    int u, v;
    for (int i = 1; i < n; i++)
    {
        cin >> u >> v;
        e[u].push_back(v);
        e[v].push_back(u);
    }
    dfs(1, 0, 1);
    cout << 1LL * odd * (odd - 1) / 2 + 1LL * even * (even - 1) / 2 << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_44169557/article/details/106003895