zoukankan      html  css  js  c++  java
  • 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;
        }
    };
    
  • 相关阅读:
    javascript、jQuery的扩展方法,扩展实例展示代码
    经典弹出层Colorbox
    在Entity Framework中使用事务
    WCF中常用的binding方式
    前端上传组件Plupload使用指南
    SQL ROW_NUMBER() OVER函数的基本用法用法
    数据库选项--触发器
    数据库选项--会刷新过程缓存的选项
    数据库选项--页面检查
    数据库选项--自动更新统计
  • 原文地址:https://www.cnblogs.com/xgbt/p/14944403.html
Copyright © 2011-2022 走看看