有效的BFS

这个题我看到了别人发的题解,那叫一个复杂呀,看的我是头晕眼花,那就有人说了,难道博主有更好的方法,哎~,被你说对了

【问题描述】

   在图的BFS(广度优先搜索)中,通常采用队列来保存当前顶点的邻接点,但对对应邻接点的存入顺序没有要求,因此对于一个图的BFS结果可以有多个,在本问题中,从顶点1开始,请验证一个给定的顶点序列是否为一个有效的BFS序列?

【输入形式】

   输入的第一行为一个整数 n (1≤ n ≤ 2 ×105),表示树中节点的数量。

   接下来 n-1 行描述了树的边,每行包含两个整数 x 和 y (1 ≤ x ,  y ≤ n),表示对应边的两个端点,输入保证给定的图构成一颗树。

   最后一行为 n 个互不相同的整数 a1、a2、...、an( 1 ≤ ai ≤ n),代表待检验的顶点序列。

【输出形式】

   如果待检验的序列是一个正确的BFS序列,输出"Yes",否则输出"No"。

【样例输入1】

4
1 2
1 3
2 4
1 2 3 4

【样例输出1】

Yes

【样例输入2】

4
1 2
1 3
2 4
1 2 4 3

【样例输出2】

No

话不多说,肯定只有思路启发,嘿嘿嘿

听我为你娓娓道来:
首先,肯定需要一个数组来储存题目中给定的那个顺序吧,那好,我最后肯定是要比较我得到的顺序是否一样吧,那我得到的顺序肯定也要存在数组中吧,那我bfs要用队列怎么办,哎·,这个问得好,我用数组实现队列不就好了吗(嘶,要长脑子了)
那么就有人说了,比较的问题解决了,那要怎么得到bfs的顺序呢,而且一次就能比较成功(得到的顺序和给定的顺序一样就是Yes,不一样就是No),哎·,别急,我讲
我只要把我得出的顺序按照给定的顺序靠,不就好了吗?
哎·,有人就要问了,怎么靠呢,总的来说就是优先级(需要自己用数组创建),就拿样例吧来解释,
1 2 3 4,
1的优先级为1,2为2,3为3,4为4,哎,有道理,本来邻接表是这样的
1->2->3
2->4
我按优先级排个序,是不是不变呀,那我得出来就是1 2 3 4了呀,哦
有人就说说了,碰巧
那好,下一个样例,1 2 4 3
1的优先级为1,2为2,4为3,3为4,哎,排个序好像还是 1 2 3 4,那没办法了,就只能是No了呗
那我再假设给定的是1 3 2 4
哎,可以举手抢答了
邻接表是不是要变量呀,3的优先级在2前面了,那就变为
1->3->2
2->4
哎,那从1开始bfs是不是就是1 3 2 4

Yes!

会了吧,拜拜;有人就要说了,先别,还没上代码呢,“寻找灵感而不是寻找答案”

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

无意识程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值