🏙️ 两个城市间路径的最小分数
📝 题目描述
给你一个正整数n
,表示共有n
个城市,城市从1
到n
编号。给你一个二维数组roads
,其中
两个城市之间一条路径的分数定义为这条路径中道路的最小距离。
城市1
和城市n
之间的所有路径的最小分数。
注意:
- 一条路径指的是两个城市之间的道路序列。
- 一条路径可以多次包含同一条道路,你也可以沿着路径多次到达城市
1
和城市n
。 - 测试数据保证城市
1
和城市n
之间至少有一条路径。
📋 代码模板
java
class Solution {
public int minScore(int n, int[][] roads) {
}
}
typescript
function minScore(n: number, roads: number[][]): number {
}
💡 提示
- 不会有重复的边
- 城市
1
和城市n
之间至少有一条路径
🚀 示例
🖊️ 题解
DFS
可惜没有如果
java
class Solution {
public int minScore(int n, int[][] roads) {
Map<Integer, Integer>[] graph = new Map[n + 1];
for (int i = 1; i <= n; i++) {
graph[i] = new HashMap<>();
}
for (int[] road : roads) {
int x = road[0], y = road[1], d = road[2];
graph[x].put(y, d);
graph[y].put(x, d);
}
boolean[] visited = new boolean[n + 1];
int[] minEdge = new int[]{Integer.MAX_VALUE};
dfs(graph, visited, minEdge, 1);
return minEdge[0];
}
private void dfs(Map<Integer, Integer>[] graph, boolean[] visited, int[] minEdge, int i) {
if (visited[i]) {
return;
}
visited[i] = true;
for (int next : graph[i].keySet()) {
minEdge[0] = Math.min(minEdge[0], graph[i].get(next));
dfs(graph, visited, minEdge, next);
}
}
}
typescript
function minScore(n: number, roads: number[][]): number {
const graph: Map<number, number>[] = [];
for (let i = 1; i <= n; i++) {
graph[i] = new Map<number, number>();
}
for (const road of roads) {
const x = road[0], y = road[1], d = road[2];
graph[x].set(y, d);
graph[y].set(x, d);
}
const visited: boolean[] = Array(n + 1).fill(false);
let minEdge = Number.MAX_SAFE_INTEGER;
const dfs = (graph: Map<number, number>[], visited: boolean[], i: number): void => {
if (visited[i]) {
return;
}
visited[i] = true;
for (const next of graph[i].keys()) {
minEdge = Math.min(minEdge, graph[i].get(next)!);
dfs(graph, visited, next);
}
}
dfs(graph, visited, 1);
return minEdge;
}
BFS
可惜没有固若
java
class Solution {
public int minScore(int n, int[][] roads) {
Map<Integer, Integer>[] graph = new Map[n + 1];
for (int i = 1; i <= n; i++) {
graph[i] = new HashMap<>();
}
for (int[] road : roads) {
int x = road[0], y = road[1], d = road[2];
graph[x].put(y, d);
graph[y].put(x, d);
}
boolean[] visited = new boolean[n + 1];
Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
visited[1] = true;
int minEdge = Integer.MAX_VALUE;
while (!queue.isEmpty()) {
int i = queue.poll();
for (int next : graph[i].keySet()) {
minEdge = Math.min(minEdge, graph[i].get(next));
if (!visited[next]) {
queue.offer(next);
visited[next] = true;
}
}
}
return minEdge;
}
}
typescript
function minScore(n: number, roads: number[][]): number {
const graph: Map<number, number>[] = [];
for (let i = 1; i <= n; i++) {
graph[i] = new Map<number, number>();
}
for (const road of roads) {
const x = road[0], y = road[1], d = road[2];
graph[x].set(y, d);
graph[y].set(x, d);
}
const visited: boolean[] = Array(n + 1).fill(false);
const queue: number[] = [1];
visited[1] = true;
let minEdge = Number.MAX_SAFE_INTEGER;
while (queue.length > 0) {
const i: number = queue.shift()!;
for (const next of graph[i].keys()) {
minEdge = Math.min(minEdge, graph[i].get(next)!);
if (!visited[next]) {
queue.push(next);
visited[next] = true;
}
}
}
return minEdge;
}