815. 公交路线 BFS

给你一个数组 routes ,表示一系列公交线路,其中每个 routes[i] 表示一条公交线路,第 i 辆公交车将会在上面循环行驶。

例如,路线 routes[0] = [1, 5, 7] 表示第 0 辆公交车会一直按序列 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... 这样的车站路线行驶。
现在从 source 车站出发(初始时不在公交车上),要前往 target 车站。 期间仅可乘坐公交车。

求出 最少乘坐的公交车数量 。如果不可能到达终点车站,返回 -1 。

示例 1:

输入:routes = [[1,2,7],[3,6,7]], source = 1, target = 6
输出:2
解释:最优策略是先乘坐第一辆公交车到达车站 7 , 然后换乘第二辆公交车到车站 6 。
示例 2:

输入:routes = [[7,12],[4,5,15],[6],[15,19],[9,12,13]], source = 15, target = 12
输出:-1

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/bus-routes
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {
public:
    int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
        if (source == target) {
            return 0;
        }

        int n = routes.size(); //n条路线
        vector<vector<bool>> g(n, vector<bool>(n)); //g[i][j],路线i与路线j相连
        unordered_map <int, vector<int>> mp; //mp[i],经过站i的所有路线

        // 建图,把路线当做点
        for (int i = 0; i < n; i++) {
            for (auto site : routes[i]) {
                mp[site].push_back(i);
            }
        }
        for (int i = 0; i < n; i++) {
            for (auto site : routes[i]) {
                for (auto j : mp[site]) {
                    g[i][j] = g[j][i] = true;
                }
            }
        }

        
        vector<int> dis(n, -1); // dis[i] 从起始路线到路线i的最短距离
        queue <int> q;
        // 把起始点所在的路线扔进queue
        for (auto route : mp[source]) {
            dis[route] = 1;
            q.push(route);
        }

        // bfs计算从起始点所在路线到其他路线的最短距离
        while (!q.empty()) {
            int u = q.front();
            q.pop();
            for (int v = 0; v < n; v++) {
                if (g[u][v] && dis[v] == -1) {
                    dis[v] = dis[u] + 1;
                    q.push(v);
                }
            }
        }

        // 遍历终点所在的所有路线,找出距离最近的那条
        int ans = INT_MAX;
        for (auto route : mp[target]) {
            if (dis[route] != -1) {
                ans = min(ans, dis[route]);
            }
        }

        return ans == INT_MAX ? -1 : ans;
    }
};
posted @ 2021-06-28 14:38  _西瓜不甜  阅读(58)  评论(0编辑  收藏  举报