栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Dis2(dfs树)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dis2(dfs树)

Dis2

  •  比赛主页
  •  我的提交

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述 

给出一颗nn个点n−1n−1条边的树,点的编号为1,2,...,n−1,n1,2,...,n−1,n,对于每个点i(1≤i≤n)i(1≤i≤n),输出与点ii距离为22的点的个数。 

两个点的距离定义为两个点最短路径上的边的条数。 

输入描述:
 

第一行一个正整数nn。

接下来n−1n−1行每行两个正整数ui,viui​,vi​表示点ui,viui​,vi​之间有一条边。

输出描述:
输入共nn行,第ii行输出一个整数表示与点ii距离为22的点的个数。

示例1

输入

复制

4
1 2
2 3
3 4
输出

复制

1
1
1
1
说明
点1,31,3的距离为22,点2,42,4的距离为22。
备注:
1≤ui,vi≤n≤2000001≤ui​,vi​≤n≤200000

思路:

距离为2的点的个数=父亲节点的边树-1+子树边树-1

dfs遍历树就行

int n;
const int MAX=2e5+10;
vectorg[MAX];
int cnt[MAX];
void dfs(int u,int f){
    if(f>0) cnt[u]+=g[f].size()-1;
    for(int i=0;i>n;
    for(int i=1;i>u>>v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1,0);
    
    for(int i=1;i<=n;i++){
        cout< 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/297852.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号