Treepath

Treepath

https://ac.nowcoder.com/acm/problem/14248

树上长度为偶数路径的条数的求法
我们只要找出奇数深度的点的个数跟偶数深度点的个数即可。
奇数深度跑去奇数深度的长度必定为偶数,偶数深度跑去偶数深度的也必定是偶数
于是问题就得解了

dfs求出所有点的深度,设奇数深度点的个数为a,偶数深度点的个数为b

那么答案就是a(a-1)/2+b(b-1)/2

#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define re register
#define pb push_back
#define fi first
#define se second
const int N=2e5+10;
const int mod7=1e9+7;
const int mod=1e9+7;
void read(int &a)
{
    a=0;int d=1;char ch;
    while(ch=getchar(),ch>'9'||ch<'0')
        if(ch=='-')
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>='0'&&ch<='9')
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
void read(ll &a)
{
    a=0;int d=1;char ch;
    while(ch=getchar(),ch>'9'||ch<'0')
        if(ch=='-')
            d=-1;
    a=ch^48;
    while(ch=getchar(),ch>='0'&&ch<='9')
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
vector <int> v[N];
int dep[N];
void dfs(int x,int f)
{
    dep[x]=dep[f]+1;
    for(auto i:v[x])
    {
        if(i==f) continue;
        dfs(i,x);
    }
}
int main()
{
    int n;read(n);
    for(re int i=1;i<n;i++)
    {
        int x,y;
        read(x),read(y);
        v[x].pb(y),v[y].pb(x);
    }
    dfs(1,0);
    int a=0,b=0;
    for(re int i=1;i<=n;i++) if(dep[i]&1) a++;else b++;
    ll ans=1ll*a*(a-1)/2+1ll*b*(b-1)/2;
    printf("%lld\n",ans);
    return 0;
}
全部评论

相关推荐

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