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的主要内容,如果未能解决你的问题,请参考以下文章

权限管理逻辑

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?

VSCode自定义代码片段——.vue文件的模板