首页 > 其他分享 >[简单] 树上的dfs & bfs_洛谷P5908 猫猫和企鹅

[简单] 树上的dfs & bfs_洛谷P5908 猫猫和企鹅

时间:2024-08-04 21:40:01浏览次数:9  
标签:洛谷 val int P5908 dfs const include define

题目链接https://www.luogu.com.cn/problem/P5908

题目大意:

\[\begin{align*} & 给定n个点构成一颗树 每条边val=1\\ & 求从根节点Root=1开始 \quad 其它所有点v到Root的距离\mathrm{dis(v,Root)} <=\mathrm{d}的点的数量\\ \end{align*} \]

思路:

1.bfs 队列跑一遍 记录每个点的父亲 遇到父亲就跳过
2.dfs 同上 不过dfs使用递归,用另一个参数记录父亲即可 无需开数组father[N]
#include <cstdio>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define ep emplace_back 

#define lld long long 
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0); 
#define vec vector 
const int N = 2e5+9;
const int INF = 0x7FFFFFFF; //2147483647

const int inf1 = 0x3f3f3f3f; //1061109567
const int inf2 = 0x7f7f7f7f; //2139062143 memset赋值用

using namespace std;

vec<int>adj[N];
struct node{
    /* data */
    int to,val,next;
};
node e[N];
int idx=0,head[N];
void add(int u,int v,int val){
    e[idx] = {v,val,head[u]};
    head[u]  = idx++;
}
int n,d;//n 个点
int ans=0;
int dist[N];//所有节点到根节点1的距离
void bd(){
    cin>>n>>d;
    for(int i=1;i<=n;++i) head[i] = -1;
    for(int i=1;i<=n-1;++i){
        int u,v;
        cin>>u>>v;
        add(u,v,0);//双向
        add(v,u,0);
    }
}
void dfs(int u,int father){
    if( dist[u] <= d) ans++;
    for(int i=head[u] ; i!=-1 ; i = e[i].next){
        int v = e[i].to;
        if( v == father) continue;
        dist[v] = dist[u]+1;
        dfs(v,u);
    }
}

bool vis[N];
int fa[N];
void bfs(){
    queue<int>q;
    q.push(1);
    while(!q.empty()){
        int u = q.front();
        q.pop();
        if(dist[u] <= d) 
            ans++;
        for(int i = head[u] ; i!=-1 ; i=e[i].next){
            int v = e[i].to;
            if(v == fa[u]) continue;
            fa[v] = u;
            dist[v] = dist[u] + 1;
            q.push(v);
        }
    }
}
int main(){
    ios;
    bd();
    //dfs(1,0);
    bfs();
    cout<<ans-1;
    //第一次会判定 dist[1] <=d ? 答案为真  ans+= 因此ans要-1
    return 0;
}

标签:洛谷,val,int,P5908,dfs,const,include,define
From: https://www.cnblogs.com/Phrink734/p/18337270

相关文章

  • 【LCA 树上两点的距离 判定点是否在某条边中】洛谷P3398 仓鼠找sugar
    题目链接:P3398仓鼠找sugar-洛谷|(luogu.com.cn)题目大意:判定一棵树上的两条边是否相交Tag:[LCA][树上两点间距离的计算][如何判断与点在某条路径上]思路:\[\begin{align}&1.建图\\&2.\text{dfs}然后\计算出每个点的深度和计\text{anc}(i,j)\\&3.根据树上路径......
  • 深度优先遍历图--DFS
    一.前言    图的遍历定义:从已经给出的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,使每个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算。    图的遍历实质:找每个顶点的邻接点的过程。在找顶点邻接点的过程中,可能会出现重复访问某个邻接点的情况,......
  • 超好玩洛谷小游戏大全,好玩到停不下来(用洛谷的人都必须要知道,程序猿、OIer必备)
    Game啊你颓废了快点这个<tuifei break>{\color{White}\colorbox{Pink}{<tuifeibreak>}}<tuifei b......
  • P5908
    P5908猫猫和企鹅题目描述王国里有 n 个居住区,它们之间有 n−1条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1。除 1 号居住区外,每个居住区住着一个小企鹅,有一天一只猫猫从 1号居住区出发,想要去拜访一些小企鹅。可是猫猫非常的......
  • 洛谷 统计天数 + 语句解析 题解
    题目:P1567统计天数P1597语句解析第一道:P1567统计天数题目描述炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。经历千辛万苦,他收集了连续 N(1≤N≤10^6)天的最高气温数据。现在......
  • C++ 最小生成树 洛谷
    介绍:最小生成树是个啥?其实就像杨志一行人押送生辰纲。抛开最后生辰纲被抢的结局不谈,杨志他们需要到好几个地方,每个地方都需要花点过路费给梁山好汉们打点。比如下面就是一张城市地图:其中每两个图之间的路径长就是要给梁山好汉们打点的银子数。比如1号地点到2号地点的梁山好......
  • 洛谷P6786
    题目原题链接https://www.luogu.com.cn/problem/P6786题目描述小A有一个长度为n的序列a_1,a_2,...,a_n。他想从这些数中选出一些数b_1,b_2,...,b_k满足:对于所有i(1<=i<=k),b_i要么是序列b中的最大值,要么存在一个位置j使得b_j>b_i且b_i+b_j+g......
  • Hadoop:java使用HDFS API实现基本操作工具类
    1、引入库<dependency><groupId>org.apache.hadoop</groupId><artifactId>hadoop-common</artifactId><version>3.1.0</version></dependency><dependency><groupId>org.apache.hadoop</......
  • 洛谷P4554 小明的游戏
    小明的游戏题目描述小明最近喜欢玩一个游戏。给定一个n×m的棋盘,上面有两种格子#和@。游戏的规则很简单:给定一个起始位置和一个目标位置,小明每一步能向上,下,左,右四个方向移动一格。如果移动到同一类型的格子,则费用是0,否则费用是1。请编程计算从起始位置移动到目标位置的最小......
  • 洛谷 P1080 [NOIP2012 提高组] 国王游戏
    一道非常有挑战性的题目(~太难了~)。这题我们可以用贪心来做。思路:首先我们定义一个结构体struct,里面放的是每个人左手和右手的数字。接着我们需要一种排列方式,使得获得奖赏最多的大臣,所获奖赏尽可能的少;这句话听起来是不是听绕口?意思就是说得到奖赏数量最多,但加起来的总奖赏......