【每日一题0415】树上dfs+技巧

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

技巧:偶 = 偶 + 偶 = 奇 + 奇。
偶数层到偶数层的节点路径长度为偶数,奇数层到奇数层的节点路径长度为偶数,
算出每个节点的深度,统计深度为奇、偶数的节点个数odd、even。
答案就是
树上dfs直接统计深度就可以了

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define N 100005
ll n,tot,rt,dis[N],fa[N],h[N],ne[N<<1],p[N<<1],wi[N<<1];
void addEdge(int u,int v,int w){p[++tot]=v;ne[tot]=h[u];h[u]=tot;wi[tot]=w;}
void add(int u,int v){p[++tot]=v;ne[tot]=h[u];h[u]=tot;}
ll odd,even;
void dfs(int u,int fa,int dep){
    if(dep&1) odd++;
    else even++;
    for(int i=h[u];i;i=ne[i])if(p[i]!=fa){
        dfs(p[i],u,dep+1);
    }
}
int main(){
    int n;cin>>n;
    for(int i=1;i<n;i++){
        int x,y;cin>>x>>y;
        add(x,y);add(y,x);
    }
    dfs(1,0,0);
    cout<<odd*(odd-1)/2+even*(even-1)/2;
    return 0;
}
全部评论

相关推荐

点赞 评论 收藏
分享
一个菜鸡罢了:哥们,感觉你的简历还是有点问题的,我提几点建议,看看能不能提供一点帮助 1. ”新余学院“别加粗,课程不清楚是否有必要写,感觉版面不如拿来写一下做过的事情,教育经历是你的弱势就尽量少写 2. “干部及社团经历”和“自我评价”删掉 3. 论文后面的“录用”和“小修”啥的都删掉,默认全录用,问了再说,反正小修毕业前肯定能发出来 4. 工作经验和研究成果没有体现你的个人贡献,着重包装一下个人贡献
点赞 评论 收藏
分享
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务