1334. 阈值距离内邻居最少的城市(中等)

1,问题描述

1334. 阈值距离内邻居最少的城市

难度:中等

n 个城市,按从 0n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromitoi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold

返回在路径距离限制为 distanceThreshold 以内可到达城市最少的城市。如果有多个这样的城市,则返回编号最大的城市。

注意,连接城市 ij 的路径的距离等于沿该路径的所有边的权重之和。

示例 1:

img

1
2
3
4
5
6
7
8
9
输入:n = 4, edges = [[0,1,3],[1,2,1],[1,3,4],[2,3,1]], distanceThreshold = 4
输出:3
解释:城市分布图如上。
每个城市阈值距离 distanceThreshold = 4 内的邻居城市分别是:
城市 0 -> [城市 1, 城市 2]
城市 1 -> [城市 0, 城市 2, 城市 3]
城市 2 -> [城市 0, 城市 1, 城市 3]
城市 3 -> [城市 1, 城市 2]
城市 0 和 3 在阈值距离 4 以内都有 2 个邻居城市,但是我们必须返回城市 3,因为它的编号最大。

示例 2:

img

1
2
3
4
5
6
7
8
9
10
输入:n = 5, edges = [[0,1,2],[0,4,8],[1,2,3],[1,4,2],[2,3,1],[3,4,1]], distanceThreshold = 2
输出:0
解释:城市分布图如上。
每个城市阈值距离 distanceThreshold = 2 内的邻居城市分别是:
城市 0 -> [城市 1]
城市 1 -> [城市 0, 城市 4]
城市 2 -> [城市 3, 城市 4]
城市 3 -> [城市 2, 城市 4]
城市 4 -> [城市 1, 城市 2, 城市 3]
城市 0 在阈值距离 2 以内只有 1 个邻居城市。

提示:

  • 2 <= n <= 100
  • 1 <= edges.length <= n * (n - 1) / 2
  • edges[i].length == 3
  • 0 <= fromi < toi < n
  • 1 <= weighti, distanceThreshold <= 10^4
  • 所有 (fromi, toi) 都是不同的。

2,初步思考

1
先使用floyd计算+找出最小的值的index

3,代码处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package questions;

import java.util.Arrays;

public class _1334阈值距离内邻居最少的城市 {

// 解法:先使用floyd计算+找出最小的值已经个数(直接使用优先队列)
public int findTheCity(int n, int[][] edges, int distanceThreshold) {
int[][] dist = new int[n][n];
int[][] pre = new int[n][n];
for (int i = 0; i < n; i++) {
Arrays.fill(dist[i], Integer.MAX_VALUE / 2);
dist[i][i] = 0;
pre[i][i] = i;
}
for (int[] edge : edges) {
dist[edge[0]][edge[1]] = edge[2];
dist[edge[1]][edge[0]] = edge[2];
}
for (int i = 0; i < n; i++) {// 选取一个要解封的节点
for (int j = 0; j < n; j++) {// 更新最短路径
for (int k = 0; k < n; k++) {
if (dist[j][k] > dist[j][i] + dist[i][k]) {// 直达大于中转,更新
dist[j][k] = dist[j][i] + dist[i][k];
pre[j][k] = i;
}
}
}
}
int minCnt = Integer.MAX_VALUE;
int idx = -1;
for (int i = 0; i < n; i++) {
int cnt = 0;
for (int j = 0; j < n; j++) {
if (i != j && dist[i][j] <= distanceThreshold) {
cnt++;
}
}
if (minCnt >= cnt) {
minCnt = cnt;
idx = i;
}
}

return idx;
}

public static void main(String[] args) {
_1334阈值距离内邻居最少的城市 test = new _1334阈值距离内邻居最少的城市();
// int[][] edges = {
// {0, 1, 3},
// {1, 2, 1},
// {1, 3, 4},
// {2, 3, 1}
// };
int[][] edges = {
{0, 1, 2},
{0, 4, 8},
{1, 2, 3},
{1, 4, 2},
{2, 3, 1},
{3, 4, 1}
};
System.out.println(test.findTheCity(5, edges, 2));

}
}