class Solution {
public:
int minScore(int n, vector<vector<int>>& roads) {
}
};
2492. 两个城市间路径的最小分数
给你一个正整数 n
,表示总共有 n
个城市,城市从 1
到 n
编号。给你一个二维数组 roads
,其中 roads[i] = [ai, bi, distancei]
表示城市 ai
和 bi
之间有一条 双向 道路,道路距离为 distancei
。城市构成的图不一定是连通的。
两个城市之间一条路径的 分数 定义为这条路径中道路的 最小 距离。
城市 1
和城市 n
之间的所有路径的 最小 分数。
注意:
1
和城市 n
。1
和城市n
之间 至少 有一条路径。
示例 1:
输入:n = 4, roads = [[1,2,9],[2,3,6],[2,4,5],[1,4,7]] 输出:5 解释:城市 1 到城市 4 的路径中,分数最小的一条为:1 -> 2 -> 4 。这条路径的分数是 min(9,5) = 5 。 不存在分数更小的路径。
示例 2:
输入:n = 4, roads = [[1,2,2],[1,3,4],[3,4,7]] 输出:2 解释:城市 1 到城市 4 分数最小的路径是:1 -> 2 -> 1 -> 3 -> 4 。这条路径的分数是 min(2,2,4,7) = 2 。
提示:
2 <= n <= 105
1 <= roads.length <= 105
roads[i].length == 3
1 <= ai, bi <= n
ai != bi
1 <= distancei <= 104
1
和城市 n
之间至少有一条路径。原站题解
java 解法, 执行用时: 27 ms, 内存消耗: 95.9 MB, 提交时间: 2022-12-14 11:27:25
/** * 求从1出发到n的路径中最短的一条边,1和n可以重复走,那么意味着只要1点和n点能到达的任何点相关的边都要统计, * 即和1在一个连通块里面的所有边中最小的一个。 * 通过dfs从1点出发,枚举所有边。 **/ class Solution { List<int[]>[] g; boolean[] vis = new boolean[100005]; int ans = Integer.MAX_VALUE; public int minScore(int n, int[][] roads) { g = new ArrayList[n + 5]; Arrays.setAll(g, val->new ArrayList<>()); for (int[] e: roads) { g[e[0]].add(new int[]{e[1], e[2]}); g[e[1]].add(new int[]{e[0], e[2]}); } dfs(1); return ans; } void dfs(int u) { vis[u] = true; for (int[] t : g[u]) { int v = t[0], w = t[1]; ans = Math.min(ans, w); if (!vis[v]) dfs(v); } } }
python3 解法, 执行用时: 416 ms, 内存消耗: 68.3 MB, 提交时间: 2022-12-14 11:26:06
class Solution: def minScore(self, n: int, roads: List[List[int]]) -> int: graph = defaultdict(list) for u, v, d in roads: graph[u].append((v, d)) graph[v].append((u, d)) que = deque() que.append(1) visited = set() visited.add(1) res = inf while que: u = que.popleft() for v, d in graph[u]: res = min(res, d) if v not in visited: visited.add(v) que.append(v) return res
golang 解法, 执行用时: 192 ms, 内存消耗: 28.5 MB, 提交时间: 2022-12-14 11:25:23
func minScore(n int, roads [][]int) int { type edge struct{ to, d int } g := make([][]edge, n) for _, e := range roads { x, y, d := e[0]-1, e[1]-1, e[2] g[x] = append(g[x], edge{y, d}) g[y] = append(g[y], edge{x, d}) } ans := math.MaxInt32 vis := make([]bool, n) var dfs func(int) dfs = func(x int) { vis[x] = true for _, e := range g[x] { ans = min(ans, e.d) if !vis[e.to] { dfs(e.to) } } } dfs(0) return ans } func min(a, b int) int { if a > b { return b }; return a }
python3 解法, 执行用时: 500 ms, 内存消耗: 69.3 MB, 提交时间: 2022-12-14 11:24:59
# 由于路径可以折返,取连通块中的 idistance i最小的那条边,即为答案。 class Solution: def minScore(self, n: int, roads: List[List[int]]) -> int: g = [[] for _ in range(n)] for x, y, d in roads: g[x - 1].append((y - 1, d)) g[y - 1].append((x - 1, d)) ans = inf vis = [False] * n def dfs(x: int) -> None: nonlocal ans vis[x] = True for y, d in g[x]: ans = min(ans, d) if not vis[y]: dfs(y) dfs(0) return ans