NC14248 Treepath

Treepath

http://www.nowcoder.com/questionTerminal/660faba350d74df095191ec3d321c15c

题目描述
给定一棵n个点的树,问其中有多少条长度为偶数的路径。路径的长度为经过的边的条数。x到y与y到x被视为同一条路径。路径的起点与终点不能相同。

思路:从一点开始dfs求出每个点的深度,分出奇点个数a、偶点个数b,根据奇数深度+奇数深度=偶数深度、偶数深度+偶数深度=偶数深度可以得出答案ans=a(a-1)/2+b(b-1)
代码:

#include<bits/stdc++.h>

using namespace std;
#define ll long long
struct pp{
    int to,next;
}r[200005];
int head[100005];
int deg[100005];
int cnt;
ll a,b;
void add(int u,int v)
{
    deg[u]++;
    r[++cnt].to=v;
    r[cnt].next=head[u];
    head[u]=cnt;
}
void dfs(int u,int ct,int fa)
{
    if(ct%2)
        a++;
    else
        b++;
    for(int i=head[u];i;i=r[i].next)
    {
        int v=r[i].to;
        if(v==fa)continue;
        dfs(v,ct+1,u);
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    if(n<=2)
        printf("0\n");
    else
    {
        dfs(1,1,0);
        printf("%lld\n",a*(a-1)/2+b*(b-1)/2);
    }
    return 0;
}

全部评论

相关推荐

点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务