Treepath
时间限制:1秒 空间限制:32768K
题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。
示例1
输入
3
1 2
1 3
输出
1
on 复杂度 。
搜索一次性过
搜索 每个点除了父节点 下面 每个节点有多少个奇数点和偶数点。
然后所有儿子的奇数点和偶数点组合相乘。
之后返回父节点。
这时候。
奇数点变成偶数点。
偶数点加上这个节点,变成奇数点。
#include <bits/stdc++.h>
using namespace std;
#define mo 100005
vector<long long > d[mo];
long long sx[mo],sy[mo];
long long sum=0;
void dfs(long long node,long long dad,long long &x,long long &y)
{
long long js=0,os=0;
for(long long i=0;i<d[node].size();i++)
{
long long son=d[node][i];
long long s=0;
if(son!=dad)
{
long long xs=0,ys=0;
dfs(son,node,xs,ys);
sum+=js*xs;
js+=xs;
sum+=os*ys;
os+=ys;
}
}
sum+=os;
x=os+1;
y=js;
}
int main()
{
long long n;
while(cin>>n)
{
long long x,y;
for(long long i=1;i<n;i++)
{
cin>>x>>y;
d[x].push_back(y);
d[y].push_back(x);
}
long long xx=0,yy=0;
dfs(1,0,x,y);
cout<<sum<<endl;
}
}