挑战赛1 A Treepath
Treepath
时间限制:1秒 空间限制:32768K
https://www.nowcoder.com/acm/contest/15/A
题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。
示例1
输入
3 1 2 1 3
输出
1
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+100; 5 6 int n; 7 vector<int > g[N]; 8 ll a[N][3]; 9 ll ans; 10 11 void dfs(int u,int fa){ 12 for(int i=0;i<g[u].size();i++){ 13 int v=g[u][i]; 14 if(v==fa) continue ; 15 dfs(v,u); 16 a[u][0]+=a[v][1]; 17 a[u][1]+=a[v][0]+1; 18 } 19 for(int i=0;i<g[u].size();i++){ 20 int v=g[u][i]; 21 if(v==fa) continue; 22 ll x=a[u][0]-a[v][1]; 23 ll y=a[u][1]-(a[v][0]+1); 24 ans+=x*a[v][1]+y*(a[v][0]+1); 25 } 26 } 27 28 int main(){ 29 scanf("%d",&n); 30 for(int i=1;i<n;i++){ 31 int x,y; 32 scanf("%d%d",&x,&y); 33 g[x].push_back(y); 34 g[y].push_back(x); 35 } 36 dfs(1,0); 37 ans/=2; 38 for(int i=1;i<=n;i++) 39 ans+=a[i][0]; 40 cout<<ans<<endl; 41 }