这个题我看到了别人发的题解,那叫一个复杂呀,看的我是头晕眼花,那就有人说了,难道博主有更好的方法,哎~,被你说对了
【问题描述】
在图的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