Skip to main content

Breadth-first Search - Hard - Question 1

Breadth-first Search - Hard - Question 1


815. Bus Routes

You are given an array routes representing bus routes where routes[i] is a bus route that the ith bus repeats forever.

For example, if routes[0] = [1, 5, 7], this means that the 0th bus travels in the sequence 1 -> 5 -> 7 -> 1 -> 5 -> 7 -> 1 -> ... forever.

You will start at the bus stop source (You are not on any bus initially), and you want to go to the bus stop target. You can travel between bus stops by buses only.

Return the least number of buses you must take to travel from source to target. Return -1 if it is not possible.

Constraints:

1 <= routes.length <= 500.

1 <= routes[i].length <= 10^5

All the values of routes[i] are unique.

sum(routes[i].length) <= 10^5

0 <= routes[i][j] < 10^6

0 <= source, target < 10^6


Analysis:

One of key steps to this question is to build the connections.

For example, once we start with the source stop, then we know what is the next stops to go. With the connections, we should quickly know what they are (without scanning the raw data).

This connection is usually called a graph.

After having this graph, we can do a regular breadth-first search (bfs) for the shortest distance. And also, to avoid redundant visits, we can use a visit array to record this.


See the code below:

class Solution {
public:
    int numBusesToDestination(vector<vector<int>>& routes, int source, int target) {
        int res = 0, n = routes.size();
        if(source == target) return res;
        unordered_map<int, vector<int>> data;
        for(int i=0; i<n; ++i) {
            for(auto &a : routes[i]) {
                data[a].push_back(i);
            }
        }
        vector<int> hs(n, 0), vt(n, 0);
        for(auto &a : data[target]) hs[a] = 1;
        queue<int> q;
        for(auto &a : data[source]) {
            q.push(a);
            vt[a] = 1;
        }
        while(q.size()) {
            ++res;
            int k = q.size();
            for(int i=0; i<k; ++i) {
                auto t = q.front();
                q.pop();
                if(hs[t]) return res;
                for(auto &b : routes[t]) {
                    for(auto &a : data[b]) {
                        if(!vt[a]) {
                            q.push(a);
                            vt[a] = 1;
                        }
                    }
                }
            }
        }
        return -1;
    }
};


Upper Layer




Comments

Popular posts from this blog

Dynamic Programming - Easy Level - Question 1

Dynamic Programming - Easy Level - Question 1 Leetcode 1646  Get Maximum in Generated Array You are given an integer n. An array nums of length n + 1 is generated in the following way: nums[0] = 0 nums[1] = 1 nums[2 * i] = nums[i] when 2 <= 2 * i <= n nums[2 * i + 1] = nums[i] + nums[i + 1] when 2 <= 2 * i + 1 <= n Return the maximum integer in the array nums​​​. Constraints: 0 <= n <= 100 Analysis: This question is quick straightforward: the state and transitional formula are given; the initialization is also given. So we can just ready the code to iterate all the states and find the maximum. See the code below: class Solution { public: int getMaximumGenerated(int n) { int res = 0; if(n<2) return n; vector<int> f(n+1, 0); f[1] = 1; for(int i=2; i<=n; ++i) { if(i&1) f[i] = f[i/2] + f[i/2+1]; else f[i] = f[i/2]; // cout<<i<<" "<<f[i]<<endl; ...

Bit Manipulation - Medium Level

 Leetcode 416 Partition Equal Subset Sum Given a non-empty array nums containing only positive integers, find if the array can be partitioned into two subsets such that the sum of elements in both subsets is equal. Constraints: 1 <= nums.length <= 200 1 <= nums[i] <= 100 Analysis: There are different ways to solve this problem, such as dp with a time complexity of O(N^2). Since N is small to this question, so it is Okay to pass OJ. Besides the small N, the value of each element is also very small. So this gives us some chance to use "space to trad off time". The data structure to be used is bitset. For bitset, each bit can be either 0 or 1. The index of that bit can be used as the corresponding sum. When the bit is 1, means there is a sum with the value of its index. When a new number comes, this number needs to be added to all the previous sums, to form new "previous" sums. Thus for each number, we need to go through all the previous sums, the time co...