Wannafly挑战赛1 A.Treepath(dfs)

来源:互联网 发布:网站数据统计工具 编辑:程序博客网 时间:2024/04/28 15:36

题目: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
思路:dfs记录奇偶个数,O(n)
代码:

#include<bits/stdc++.h>using namespace std;const int N = 100005;int num[2],vis[N];vector<int> G[N];void dfs(int u,int cnt){    num[cnt]++;    vis[u] = 1;    for(auto v : G[u])    {        if(vis[v])            continue;        dfs(v,1-cnt);    }}int main(){    int n,u,v;    scanf("%d",&n);    for(int i = 0;i < n-1;i++)    {        scanf("%d%d",&u,&v);        G[u].push_back(v);        G[v].push_back(u);    }    dfs(1,0);    long long sum = num[0]*(num[0]-1ll)/2 + num[1]*(num[1]-1ll)/2;    printf("%lld\n",sum);    return 0;}