题目分析
最近的每日一题全部都是BFS,总是给小伙伴们介绍这类题型,可能会感觉到厌倦,但是集中训练也是非常有帮助的,而且最近这几题每一题的难度都较大,能做出这几道题目,有一种五岳归来不看山,黄山归来不看岳的感觉。
广度优先搜索
BFS的代码非常简单,有公式模板可以去套用,简而言之就是建立一个队列,从队头去状态,从队尾加状态。
本题的难点在于如何进行状态的抽象与表示,假设当前处于第k个车站,那么乘坐该站台的所有公交线路,假设该站台有m个公交线路,那么一次乘坐可以到达哪些站呢?想通这个问题,本题的状态表示就迎刃而解了。
答案是一次乘坐可以到达这些所有公交线路经过的所有站点。假设可以有m1和m2两个线路经过当前车站,m1线路经过k11、k12、k13这三个站点,m2路线经过k21、k22、k23、k24这四个站点,那么一次乘坐公交,可以乘坐m1线路到达三个站点,也可以乘坐m2线路到达四个站点。
所以我们需要知道某个站点的所有线路,但是输入的route是线路经过的所有站点,因此要建立一个哈希表,键为站点号,值为一个set集合,存放该站点可以乘坐的所有线路。
并建立两个set集合,分别表示已访问的站点和已访问的路线,当站点或路线已经访问,则不添加到队列进行剪枝。
当然本题从起始公交站搜索到终止公交站等价于从终止公交站搜索到起始公交站,因此可以使用双向BFS进行优化。
算法的**时间复杂度为$O(m^n)$,空间复杂度为$O(m^n)$**,其中m为线路个数,n站点个数。
下面是C++语言的题解
1 | class Solution { |
下面是Python语言的题解
1 | class Solution: |
对比C++和Python两种语言,可以发现C++语言中,创建数据结构时,会默认创建内层的数据,如vector
刷题总结
听过上面的分析后,小伙伴能否自己实现BFS呢,一定要多刷多练,慢慢就会找到做题的感觉。