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;
}
全部评论

相关推荐

04-21 13:50
已编辑
北京理工大学 硬件测试
我们学校连夜发了声明,绝了绝了!看完了全部ppt,震碎三观。一般情况下我是站学生的,但这不是一般情况。这男的不能被取消学位吗?自己吃到了红利,靠着面试泄题得到的保研,又反手举报导师。这导师是《被举报系列》里最惨最恋爱脑的了,当然最可怜的是他的同妻……
牛客小黄鱼:看了ppt的聊天记录,真不知道谁才是受害者!有人为你剥过柚子吗?有人为你雪地里等你吗?有人为你写过情书吗?有人为你规划未来吗?有人为你小心翼翼吗?有人为你整页失眠失眠吗? 有人为你送上自己的科研成果吗?有人为你安排出国留学吗?有人愿意给你一个月2万吗?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务