列表

详情


2492. 两个城市间路径的最小分数

给你一个正整数 n ,表示总共有 n 个城市,城市从 1 到 n 编号。给你一个二维数组 roads ,其中 roads[i] = [ai, bi, distancei] 表示城市 ai 和 bi 之间有一条 双向 道路,道路距离为 distancei 。城市构成的图不一定是连通的。

两个城市之间一条路径的 分数 定义为这条路径中道路的 最小 距离。

城市 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 。

 

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int minScore(int n, vector<vector<int>>& roads) { } };

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

上一题