Treepath
题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。
示例1
输入
3
1 2
1 3
输出
1
分析:
在一棵树上,两个点之间的路径只有一条。求长度为偶数的路径,偶数层到偶数层的路径长度是偶数,奇数层到奇数层是偶数,分别求出奇数层点的个数
,偶数层点的个数
,任意从奇数层的点中选出两个点就有唯一的一条路径,那么总的路径数就是
,同理偶数层的点是
。注意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;
}