Treepath
Posted starry
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Treepath相关的知识,希望对你有一定的参考价值。
Treepath
题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。
输入描述:
第一行一个数n表示点的个数;
接下来n-1行,每行两个整数x,y表示边;
保证输入数据形成一棵树;
1<=n<=100000
输出描述:
一行一个整数表示答案。
示例1
输入
3 1 2 1 3
输出
1
dfs,假设1为最顶层,遍历每一个节点,求出奇数层和偶数层的数量。
1 #include <bits/stdc++.h> 2 using namespace std; 3 #define ll long long 4 const int N = 100010; 5 vector<int> vs[N]; 6 bool vis[N]; 7 ll ans1, ans2; 8 void dfs(int x, int de) { 9 vis[x] = true; 10 for(int i = 0; i < vs[x].size(); i ++) { 11 int v = vs[x][i]; 12 if(!vis[v]) { 13 if((de+1) %2) ans1 ++; 14 else ans2 ++; 15 dfs(v, de+1); 16 } 17 } 18 } 19 void init(){ 20 ans1 = ans2 = 0; 21 memset(vis, false, sizeof(vis)); 22 for(int i = 1; i < N; i ++) vs[i].clear(); 23 } 24 int main() { 25 int n, x, y; 26 while(scanf("%d", &n)!=EOF) { 27 init(); 28 for(int i = 1; i < n; i ++) { 29 scanf("%d %d", &x, &y); 30 vs[x].push_back(y); 31 vs[y].push_back(x); 32 } 33 dfs(1, 1); 34 ans1++; 35 // printf("%d %d\n", ans1, ans2); 36 ll cnt = (ans1-1)*ans1 + (ans2-1)*ans2; 37 printf("%lld\n",cnt/2); 38 } 39 return 0; 40 }
以上是关于Treepath的主要内容,如果未能解决你的问题,请参考以下文章