洛谷 P11962:[GESP202503 六级] 树上漫步 ← dfs + 邻接表

【题目来源】
https://www.luogu.com.cn/problem/P11962

【题目描述】
小 A 有一棵 n 个结点的树,这些结点依次以 1,2,⋯,n 标号。
小 A 想在这棵树上漫步。具体来说,小 A 会从树上的某个结点出发,每⼀步可以移动到与当前结点相邻的结点,并且小 A 只会在偶数步(可以是零步)后结束漫步。
现在小 A 想知道,对于树上的每个结点,从这个结点出发开始漫步,经过偶数步能结束漫步的结点有多少个(可以经过重复的节点)。

【输入格式】
第一行,一个正整数 n。
接下来 n-1 行,每行两个整数 ui,vi,表示树上有一条连接结点 ui 和结点 vi 的边。

【输出格式】
一行,n 个整数。第 i 个整数表示从结点 i 出发开始漫步,能结束漫步的结点数量。

【输入样例 1】
3
1 3
2 3

【输出样例 1】
2 2 1

【输入样例 2】
4
1 3
3 2
4 3

【输出样例 2】
3 3 1 3

【数据范围】
对于 40% 的测试点,保证 1≤n≤10^3。
对于所有测试点,保证 1≤n≤2×10^5。

【算法分析】
● 树在图论中是一种特殊的图,即无环连通图。

● 以任意点为树根做一次 dfs,求出每个点的深度。深度为偶数的点可以通过偶数步到达深度为偶数的任意点,深度为奇数的点可以通过偶数步到达深度为奇数的任意点。

● 利用STL中的vector实现邻接表
(1)利用STL中的vector实现"无向无权图"的邻接表:https://blog.csdn.net/hnjzsyjyj/article/details/101233779
(2)利用STL中的vector实现"有向无权图"的邻接表:https://blog.csdn.net/hnjzsyjyj/article/details/101233485
(3)利用STL中的vector实现"有向有权图"的邻接表:https://blog.csdn.net/hnjzsyjyj/article/details/101233249

● 当然,本题还可采用"链式前向星"实现数据输入
链式前向星:https://blog.csdn.net/hnjzsyjyj/article/details/139369904
e[idx]:存储序号为 idx 的边的终点值
ne[idx]:存储序号为 idx 的边指向的边的序号(模拟链表指针)‌
h[a]:存储头结点 a 指向的边的序号
val[idx]:存储序号为 idx 的边的权值(可选)

【算法代码】

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

const int N=2e5+5;
vector<int> v[N];
int dep[N];
int n,cnt[2];

void dfs(int x,int fa) {
    dep[x]=dep[fa]+1;
    cnt[dep[x]&1]++;
    for(int i=0; i<v[x].size(); i++) {
        int j=v[x][i];
        if(j==fa) continue;
        dfs(j,x);
    }
}

int main() {
    cin>>n;
    for(int i=1; i<n; i++) {
        int a,b;
        cin>>a>>b;
        v[a].push_back(b), v[b].push_back(a);
    }

    dfs(1,0);

    for(int i=1; i<=n; i++) {
        cout<<cnt[dep[i]&1]<<" ";
    }

    return 0;
}

/*
in:
3
1 3
2 3

out:
2 2 1
*/

【参考文献】
https://blog.csdn.net/guolianggsta/article/details/146534885
https://blog.csdn.net/hnjzsyjyj/article/details/139369904
https://www.luogu.com.cn/problem/solution/P11962

相关推荐
Python+JAVA+大数据2 天前
SQL玩出算法竞赛高度!郑凌云数独算法:递归CTE+位运算DFS回溯全解析
数据库·sql·算法·搜索引擎·深度优先·dfs
老鼠只爱大米3 天前
LeetCode经典算法面试题 #199:二叉树的右视图(BFS双队列法、DFS递归法等多种实现方案详细解析)
算法·leetcode·二叉树·dfs·bfs·深度优先搜索·右视图
轩情吖6 天前
数据结构-图
数据结构·c++·邻接表·邻接矩阵·最小生成树·kruskal算法·prim算法
源代码•宸7 天前
Leetcode—94. 二叉树的中序遍历【简单】
经验分享·后端·算法·leetcode·职场和发展·golang·dfs
源代码•宸7 天前
Leetcode—144. 二叉树的前序遍历【简单】
经验分享·算法·leetcode·面试·职场和发展·golang·dfs
不穿格子的程序员7 天前
从零开始写算法——图论篇2:课程表 + 实现前缀树(26叉树)
算法·深度优先·图论·dfs·bfs
少许极端7 天前
算法奇妙屋(二十六)-二叉树的深度搜索问题
算法·二叉树·dfs
老鼠只爱大米8 天前
LeetCode经典算法面试题 #104:二叉树的最大深度(深度优先搜索、广度优先搜索等多种实现方案详细解析)
算法·leetcode·二叉树·dfs·bfs·深度优先搜索·广度优先搜索
不穿格子的程序员9 天前
从零开始写算法——图论篇1:岛屿数量 + 腐烂的橘子
算法·深度优先·图论·dfs·bfs
源代码•宸12 天前
Leetcode—404. 左叶子之和【简单】
经验分享·后端·算法·leetcode·职场和发展·golang·dfs