2023-03-22 Daily Challenge

Today I have done leetcode's March LeetCoding Challenge with cpp.

March LeetCoding Challenge 22

Description

Minimum Score of a Path Between Two Cities

You are given a positive integer n representing n cities numbered from 1 to n. You are also given a 2D array roads where roads[i] = [ai, bi, distancei] indicates that there is a bidirectional road between cities ai and bi with a distance equal to distancei. The cities graph is not necessarily connected.

The score of a path between two cities is defined as the minimum distance of a road in this path.

Return the minimum possible score of a path between cities 1 and n.

Note:

  • A path is a sequence of roads between two cities.
  • It is allowed for a path to contain the same road multiple times, and you can visit cities 1 and n multiple times along the path.
  • The test cases are generated such that there is at least one path between 1 and n.

 

Example 1:

Input: n = 4, roads = [[1,2,9],[2,3,6],[2,4,5],[1,4,7]]
Output: 5
Explanation: The path from city 1 to 4 with the minimum score is: 1 -> 2 -> 4. The score of this path is min(9,5) = 5.
It can be shown that no other path has less score.

Example 2:

Input: n = 4, roads = [[1,2,2],[1,3,4],[3,4,7]]
Output: 2
Explanation: The path from city 1 to 4 with the minimum score is: 1 -> 2 -> 1 -> 3 -> 4. The score of this path is min(2,2,4,7) = 2.

 

Constraints:

  • 2 <= n <= 105
  • 1 <= roads.length <= 105
  • roads[i].length == 3
  • 1 <= ai, bi <= n
  • ai != bi
  • 1 <= distancei <= 104
  • There are no repeated edges.
  • There is at least one path between 1 and n.

Solution

class Solution {
  using pi = pair<int, int>;
public:
  int minScore(int n, vector<vector<int>>& roads) {
    vector<vector<pi>> neighbors(n);
    for(const auto &road : roads) {
      neighbors[road[0] - 1].push_back({road[1] - 1, road[2]});
      neighbors[road[1] - 1].push_back({road[0] - 1, road[2]});
    }
    
    vector<bool> vis(n);
    queue<int> q;
    q.push(0);
    vis[0] = true;
    int answer = INT_MAX;
    while(q.size()) {
      auto pos = q.front();
      q.pop();
      for(const auto &[neighbor, score] : neighbors[pos]) {
        answer = min(answer, score);
        if(vis[neighbor]) continue;
        vis[neighbor] = true;
        q.push(neighbor);
      }
    }

    return answer;
  }
};

// Accepted
// 41/41 cases passed (452 ms)
// Your runtime beats 85.54 % of cpp submissions
// Your memory usage beats 73.39 % of cpp submissions (125.4 MB)