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 <= 10^5
1 <= roads.length <= 10^5
roads[i].length == 3
1 <= ai, bi <= n
ai != bi
1 <= distancei <= 10^4
There are no repeated edges.
There is at least one path between 1 and n.
解題
使用 queue 來做 BFS
funcminScore(n int, roads [][]int) int { adj :=make([][][]int, n+1)for i:=0; i<=n; i++ { adj[i] = [][]int{} }for _, road :=range roads { adj[road[0]] =append(adj[road[0]], []int{ road[1], road[2] }) adj[road[1]] =append(adj[road[1]], []int{ road[0], road[2] }) } ans :=100000000 queue :=make([][]int, 0) queue =append(queue, []int{1, 100000000}) visited :=make([]bool, n+1) visited[1] =trueforlen(queue) !=0 { ct := queue[0][0] queue = queue[1:]for _, a :=range adj[ct] { ans =min(ans, a[1])if!visited[a[0]] { visited[a[0]] =true queue =append(queue, []int{ a[0], a[1]}) } } }return ans}funcmin(a, b int) int {if a < b { return a }return b}
Union-find
funcminScore(n int, roads [][]int) int { group :=make([]int, n+1) minpath :=make([]int, n+1)var find func(int) int find =func(a int) int {if a == group[a] { return a }returnfind(group[a]) }var union func(int, int, int) union =func(a int, b int, dis int) { aroot :=find(a) broot :=find(b)if broot < aroot { group[broot] = aroot minpath[aroot] =min(dis, min(minpath[aroot], minpath[broot])) } else { group[aroot] = broot minpath[broot] =min(dis, min(minpath[broot], minpath[aroot])) } }for i:=0; i<=n; i++ { group[i] = i minpath[i] =10000000 }for _, road :=range roads {union(road[0], road[1], road[2]) }return minpath[find(n)]}funcmin(a, b int) int {if a < b { return a }return b}