阈值距离内邻居最少的城市¶
有 n 个城市,按从 0 到 n-1 编号。给你一个边数组 edges,其中 edges[i] = [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边,距离阈值是一个整数 distanceThreshold。
返回在路径距离限制为 distanceThreshold 以内可到达城市最少的城市。如果有多个这样的城市,则返回编号最大的城市。
题解¶
此题需要求出任意两点之间的最短路。
Floyd算法¶
较为简洁的写法是Floyd算法。其核心思想是:
- 如果令 k 作为顶点 i 和 j 之间路径的中介点能够得到一条更短的路径,则令 k 作为其最短路径的中介点。
本题的代码:
class Solution:
def findTheCity(
self, n: int, edges: List[List[int]], distanceThreshold: int
) -> int:
# 初始化
inf = float("inf")
dist = [[inf for _ in range(n)] for _ in range(n)]
for i in range(n): # 自己到自己
dist[i][i] = 0
for source, target, v in edges: # 对称初始化
dist[source][target] = v
dist[target][source] = v
# 尝试用k作为中介点来松弛,计算任意节点之间的最短路
for k in range(n):
for i in range(n):
for j in range(n):
if dist[i][j] > dist[i][k] + dist[k][j]:
dist[i][j] = dist[i][k] + dist[k][j]
# 计算题目要求的内容
l = [(i, sum(x <= distanceThreshold for x in dist[i] if x!=0)) for i in range(n)]
m = inf
res = None
for i, s in l:
if s <= m:
m = s
res = i
return res
Dijsktra算法¶
当然,最短路问题我们依然可以使用Dijsktra算法,只不过它一次只能求出一个源点到其他点的最短路。
class Solution:
def findTheCity(
self, n: int, edges: List[List[int]], distanceThreshold: int
) -> int:
# 初始化
inf = float("inf")
dist = [[inf for _ in range(n)] for _ in range(n)]
for source, target, v in edges:
dist[source][target] = v
dist[target][source] = v
# 以i为源点,实施Dijkstra算法
for i in range(n):
dist[i][i] = 0
d = dist[i] # 注意这是弱引用,仅为了简化写法
visited = [False for _ in range(n)]
for j in range(n):
t = -1
# 寻找最短的路径
for k in range(n):
if not visited[k] and (t==-1 or d[k] < d[t]):
t = k
# 加入访问的集合
visited[t] = True
# 更新距离
for k in range(n):
d[k] = min(d[k], d[t]+dist[t][k])
# 计算题目要求的内容
l = [(i, sum(x <= distanceThreshold for x in dist[i] if x!=0)) for i in range(n)]
m = inf
res = None
for i, s in l:
if s <= m:
m = s
res = i
return res
最后更新: 2025-08-03 03:17:56
创建日期: 2025-08-03 03:17:56
创建日期: 2025-08-03 03:17:56
广告
人要恰饭的嘛🤑🤑