题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。
思路:
dfs记录奇偶个数,找出规律即可。这里还要说明的是如果题目是求奇数长度路径那我们只要在n点中取两个点的组合数/2减去这里的偶数即可(举一反三~~)。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int num[2],vis[N];
vector<int>G[N];
void dfs(int u,int cnt)
{
num[cnt]++;
vis[u] = 1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i];
if(vis[v])
continue;
dfs(v,1-cnt);
}
}
int main()
{
int n,u,v;
scanf("%d",&n);
for(int i = 0;i < n-1;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(1,0);
cout<<num[0]<<endl;
cout<<num[1]<<endl;
long long sum = num[0]*(num[0]-1ll)/2 + num[1]*(num[1]-1ll)/2;
printf("%lld\n",sum);
return 0;
}