在一棵树里,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入
第一行一个数n表示点的个数; 接下来n-1行,每行两个整数x,y表示边; 保证输入数据形成一棵树; 1<=n<=100000
输出
一行一个整数表示答案。
样例
输入
3 1 2 1 3
输出
1
———————————————————————————————————————————
代码:
#include<bits/stdc++.h>
using namespace std;
int n,p=0,q=0;
struct node
{
int from,to;
}a[100002];
int qz[100002]={0};
queue<int> u;
void bfs(int f)
{
qz[f]=1;
u.push(f);
while(!u.empty())
{
int d=u.front();
for(int i=1;i<n;i++)
{
if(a[i].from==d&&qz[a[i].to]==0)
{
qz[a[i].to]=qz[d]+1;
u.push(a[i].to);
}
if(a[i].to==d&&qz[a[i].from]==0)
{
qz[a[i].from]=qz[d]+1;
u.push(a[i].from);
}
}
u.pop();
}
for(int i=1;i<=n;i++)
{
if(qz[i]!=0)
{
if(qz[i]%2==0) p++;
else if(qz[i]%2==1) q++;
}
}
p=p*(p-1)/2;
q=q*(q-1)/2;
cout<<p+q;
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
cin>>a[i].from>>a[i].to;
}
bfs(1);
return 0;
}