挑战赛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 }

 

posted on 2017-10-14 11:56  hhhhx  阅读(182)  评论(0编辑  收藏  举报

导航