【BFS】【并查集】个人练习-Leetcode-815. Bus Routes

题目链接:https://leetcode.cn/problems/bus-routes/description/

题目大意:给出一系列公交车路线routes[][],每条路线上有一系列车站,可以搭乘同一班公交车经过这些车站。给出起点车站和终点车站,求最小的需要搭乘的公交车数量。

思路:其实就是把每条路线看成一个super-vertex求最短路径(这里就是建图的时候麻烦点,要用到一个map)。因为求最短,那么BFS更合适(我一开始还写DFS,后来发现同时【保留最短路径】【返回是否找得到终点】太麻烦了)。然而做了还是超时了,因为我保存这些super-vertex的连接边方式是用邻接表...看了题解直接用n*n矩阵保存边即可。

BFS时如何保存【搭乘的车的数量】呢?这就用到上次做层序遍历学到的BFS方法了,详见:https://blog.csdn.net/Rstln/article/details/139954638

注意点是如果起点和终点一样,是不需要乘车的,返回0即可。

完整代码:

cpp 复制代码
class Solution {
public:
    int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
        if (source == target)
            return 0;
        int n = routes.size();
        vector<vector<bool>> g(n, vector<bool>(n, false));
        unordered_map<int, unordered_set<int>> blg;

        for (int i = 0; i < n; i++) {
            for (auto st: routes[i]){
                for (auto it = blg[st].begin(); it != blg[st].end(); it++) {
                    g[i][*it] = g[*it][i] = true;
                }
                blg[st].insert(i);
            }
        }

        set<int> des;
        for (auto it = blg[target].begin(); it != blg[target].end(); it++) 
            des.insert(*it);
        if (des.empty())
            return -1;

        int res = -1;
        for (auto st = blg[source].begin(); st != blg[source].end(); st++) {
            queue<int> q;
            vector<bool> known(n, false);
            q.push(*st);
            known[*st] = true;
            int tmp = 0;
            bool flag = false;
            while (!q.empty()) {
                tmp++;
                for (int i = q.size(); i > 0; i--) {
                    int node = q.front();
                    q.pop();
                    if (des.count(node)) {
                        flag = true;
                        break;
                    }
                    for (int nb = 0; nb < n; nb++) {
                        if (!known[nb] && g[node][nb]) {
                            q.push(nb);
                            known[nb] = true;
                        }
                    }
                }
                if (flag)
                    break;
            }
            if (flag) {
                if (res == -1)
                    res = tmp;
                else
                    res = min(res, tmp);
            }
        }
        return res;
    }
};
相关推荐
kyle~16 小时前
排序---冒泡排序(Bubble Sort)
c语言·c++·算法
l1t16 小时前
我改写的二分法XML转CSV文件程序速度追上了张泽鹏先生的
xml·c语言·人工智能·算法·expat
一碗白开水一16 小时前
【论文阅读】Far3D: Expanding the Horizon for Surround-view 3D Object Detection
论文阅读·人工智能·深度学习·算法·目标检测·计算机视觉·3d
轮到我狗叫了17 小时前
力扣.1054距离相等的条形码力扣767.重构字符串力扣47.全排列II力扣980.不同路径III力扣509.斐波那契数列(记忆化搜索)
java·算法·leetcode
久菜盒子工作室17 小时前
量化金融|基于算法和模型的预测研究综述
算法·金融
CoovallyAIHub17 小时前
SBP-YOLO:面向嵌入式悬架的轻量实时模型,实现减速带与坑洼高精度检测
深度学习·算法·计算机视觉
CoovallyAIHub18 小时前
医药、零件、饮料瓶盖……SuperSimpleNet让质检“即插即用”
深度学习·算法·计算机视觉
dragoooon3418 小时前
[优选算法专题二滑动窗口——串联所有单词的子串]
数据结构·c++·学习·算法·leetcode·学习方法
刃神太酷啦18 小时前
C++ 异常处理机制:从基础到实践的全面解析----《Hello C++ Wrold!》(20)--(C/C++)
java·c语言·开发语言·c++·qt·算法·leetcode
Brookty19 小时前
【算法】双指针(二)复写零
学习·算法