- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Hackerrank - Dijkstra 最短距离 2
我被卡在了 TestCase 7(我唯一失败的一个),我认为这是我的错。我下载了测试用例并检查了我生成的输出。
我执行 git diff,我看不出它们之间有任何区别。你能帮我验证我的代码发生了什么吗?
或者如果我的代码中没有问题,我想更改问题:
HackerRank Platform 经常出bug吗?
在为我的求职面试做 HackerRank 挑战时,我经常遇到一个不明显的失败(通常是 13 个测试用例中的最后一两个),因此多次失败。不知道大家有没有类似的经历。我怀疑当我和 friend 一起检查我提交的代码时,我们找不到任何边缘情况或错误。它应该是完美的。作为一直在 LeetCode 中编码的程序员,这让我感到害怕,我开始在 HackerRank 上进行训练。
请指教。谢谢
资源:
P.S 在 google drive 文件夹中,我附上了我的输出:output_me.txt
和 ground truth 输出:output.txt
。我确实为两个输出添加了新行(最初,所有答案都在一长行中,添加了新行以使其更易于阅读。)
代码:
import os
from collections import defaultdict
from heapq import heappop, heappush
MAX_INT = 2**31
# Build Graph
def buildGraph(edges):
graph = defaultdict(list)
trackMinEdge = {}
# build min edges from u - v (adjacent)
# for handling duplicate edges
for u, v, weight in edges:
u, v = min(u, v), max(u, v)
if (u, v) in trackMinEdge:
minWeight = trackMinEdge[(u, v)]
if minWeight <= weight:
# do not update
continue
# only update if (u, v) not in trackMinWeight
# or the new weight is smaller than minWeight
trackMinEdge[(u, v)] = weight
# build graph from minimum adjancent edge
for u, v in trackMinEdge:
weight = trackMinEdge[(u, v)]
graph[u].append((weight, v))
graph[v].append((weight, u))
return graph
# DJIKSTRA
def djikstra(n, graph, src, dest=None):
dists = {}
# setups
seen = set()
queue = [(0, src)]
dists[src] = 0
while queue:
dist_u, u = heappop(queue)
if u in seen: continue
seen.add(u)
for weight, v in graph.get(u, []):
if v in seen: continue
alt = dists[u] + weight
if alt < dists.get(v, MAX_INT):
dists[v] = alt
heappush(queue, (alt, v))
return dists
# Complete the shortestReach function below.
def shortestReach(n, edges, src):
graph = buildGraph(edges)
# edge cases: src not connected to any node
if not (src in graph):
return [-1 for _ in range(n-1)]
dists = djikstra(n, graph, src)
distsTable = []
for i in range(1, n+1):
if i in dists and i != src:
distsTable.append(dists[i])
elif not (i in dists):
distsTable.append(-1)
return distsTable
if __name__ == '__main__':
fptr = open(os.environ['OUTPUT_PATH'], 'w+')
t = int(input())
for t_itr in range(t):
nm = input().split()
n = int(nm[0])
m = int(nm[1])
edges = []
for _ in range(m):
edges.append(list(map(int, input().rstrip().split())))
s = int(input())
result = shortestReach(n, edges, s)
fptr.write(' '.join(map(str, result)))
fptr.write('\n')
fptr.close()
问候,
我
最佳答案
我尝试了您的代码,它实际上适用于 PyCharm 上的 Test Case#7 - 实际输出与预期输出相匹配。但是,由于运行时错误,相同的代码在 Hackerrank 上失败。为什么会发生?
Runtime error/Segmentation Fault. Your code terminated unexpectedly. Did you overrun your array? Is your code trying to divide by zero?
显然,这不是因为我们用 0
来除某物因为它在本地工作。还有什么?根据Hackerrank Environment对于 Python,内存限制为 512 Mb
寻求解决方案。
因此,我决定使用 tracemalloc
来测量您的解决方案的内存使用情况。模块。
import tracemalloc
tracemalloc.start()
...
# <solution code here>
...
print("Current usage: %d, Peak usage: %d" % tracemalloc.get_traced_memory())
输出
Current usage: 549627153, Peak usage: 550966939
如您所见,它实际上超出了 512 Mb
的限制这就是为什么你可以拥有这个 Runtime Error
.因此,请尝试降低解决方案的空间复杂性。
我还注意到另一个问题 - 如果您使用 time
来衡量时间复杂度模块那么它需要超过40
测试用例 #7 完成的秒数。因此,如果您先解决空间复杂度问题,这可能是您的下一个问题。
最后,不,这里没有关于 Hackerrank 的错误 - 我的 Python 解决方案已经通过了所有测试。
更新
正如@Daniel(问题的作者)所问,我提供了我的优化版本的解决方案,它通过了 Hackerrank 上的所有测试。
# Complete the shortestReach function below.
def shortestReach(n, distanceMatrix, s):
queue = list()
queue.append(s)
minDistances = [-1] * (n + 1)
minDistances[s] = 0
while queue:
currentNode = queue.pop(0)
for neighbor in distanceMatrix[currentNode]:
newDistance = minDistances[currentNode] + distanceMatrix[currentNode][neighbor]
prevDistance = minDistances[neighbor]
if minDistances[neighbor] == -1:
minDistances[neighbor] = newDistance
else:
minDistances[neighbor] = min(newDistance, minDistances[neighbor])
if prevDistance != minDistances[neighbor]:
queue.append(neighbor)
del minDistances[s]
del minDistances[0]
print (' '.join(map(str, minDistances)))
if __name__ == '__main__':
t = int(input())
for t_itr in range(t):
nm = input().split()
n = int(nm[0])
m = int(nm[1])
distanceMatrix = [dict() for _ in range(n + 1)]
for _ in range(m):
edge = list(map(int, input().rstrip().split()))
i = edge[0]
j = edge[1]
weight = edge[2]
if i not in distanceMatrix[j]:
distanceMatrix[i][j] = distanceMatrix[j][i] = weight
else:
distanceMatrix[i][j] = distanceMatrix[j][i] = min(weight, distanceMatrix[i][j])
s = int(input())
shortestReach(n, distanceMatrix, s)
没有理由使用 heap
这里 - queue
完全够了。将节点添加到 queue
的唯一标准如果它的距离在当前步骤发生了变化。
关于python-3.x - Hackerrank 测试用例不正确? Dijkstra 最短距离 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58677483/
谁能告诉我这个 Dijkstra 算法中优先级队列的空间复杂度。请注意,这里可以将一个顶点添加到队列中不止一次。但是,由于访问集,它不会被处理超过一次。这就是为什么我想知道队列的最大大小可以达到的原因
为什么我们不能将 Dijkstra 算法应用于具有负权重的图? 最佳答案 如果每次从 C 到 D 旅行都得到报酬,那么找到从 A 到 B 的最便宜的路径意味着什么? 如果两个节点之间存在负权重,则“最
我正在阅读 工作中的程序员 . 我在 Donald Knuth 的采访中看到了这一段。 Seibel: It seems a lot of the people I’ve talked to had
我一整天都在努力理解 Dijkstra 算法并实现,但没有取得任何重大成果。我有一个城市及其距离的矩阵。我想做的是给定一个起点和一个终点,找到城市之间的最短路径。 示例: __0__ __1
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
一 问题描述 小明为位置1,求他到其他各顶点的距离。 二 实现 package graph.dijkstra; import java.util.Scanner; import java.util.
一 问题背景 在现实生活中,很多问题都可以转化为图来解决问题。例如,计算地图中两点之间的最短距离、网络最小成本布线,以及工程进度控制,等等。这些问题都涉及最小路径的求解。 二 Dijkstra 算法
谁能告诉我这个程序的错误在哪里,这真的很有帮助,我尽力解决了这个问题,这段代码只通过了两个测试用例给定一个无向图和一个起始节点,确定从起始节点到图中所有其他节点的最短路径的长度。如果一个节点不可到达,
除了 Dijkstra 之外,还有其他方法可以计算接近完整图的最短路径吗?我有大约 8,000 个节点和大约 1800 万条边。我已经完成了线程 "a to b on map"并决定使用 Dijkst
我知道 Dijkstra 的算法、Floyd-Warshall 算法和 Bellman-Ford 算法,用于查找图中 2 个顶点之间的最便宜路径。 但是当所有边的成本都相同时,最便宜的路径是边数最少的
我的问题如下:根据不同的消息来源,Dijkstra 算法只不过是 Uniform Cost Search 的一种变体。我们知道 Dijkstra 的算法会找到源和所有目的地(单源)之间的最短路径。但是
所以我的问题是我有一个带有 的有向图 G非负 边长度,我希望找到两个节点 u 和 v 之间的最短路径,以便它们只通过图中的一个标记节点。 如果我们没有涉及标记节点的条件,这个问题可以使用 Dijkst
对于使用最小堆优先级队列的 Dijkstra 实现,我将其设置为查找网络上不存在的站,以便它必须检查所有内容。我的问题是由于整体时间复杂度 O(V + E log V) ,为什么网络查找到一个站点的最
我试图找出是否可以使用 Dijkstra 算法来找到有向无环路径中的最长路径。我知道由于负成本循环,不可能在一般图中找到 Dijkstra 的最长路径。但我认为它应该在 DAG 中工作。通过谷歌我发现
我正在研究 Dijkstra 算法,我真的需要找到所有可能的最短路径,而不仅仅是一条。我正在使用邻接矩阵并应用 Dijkstra 算法,我可以找到最短路径。但是我需要以最低成本找到所有路径,我的意思是
我正在尝试创建 Dijkstra 寻路的实现,除了我要求它创建一条在同一位置开始和结束的路线之外,它似乎工作得很好。 JSFiddle:http://jsfiddle.net/Lt6b4ecr/ 我需
我们可以使用负权重的 Dijkstra 算法吗? 停止! 在您认为“大声笑,您可以在两点之间无休止地跳跃并获得无限便宜的路径”之前,我更多地考虑的是单向路径。 对此的应用程序将是一个带有点的山地地形。
我认为 Dijkstra 算法是确定的,因此,如果您选择相同的起始顶点,您将得到相同的结果(到每个其他顶点的距离相同)。但我不认为它是确定性的(它为每个操作定义了以下操作),因为这意味着它不必首先搜索
我找到了this code使用 Dijkstra 算法来查找加权图中两个节点之间的最短路径。我看到的是代码没有跟踪访问过的节点。但是它对于我尝试过的所有输入都适用。我添加了一行代码来跟踪访问过的节点。
我将 Dijkstra 算法 的 C++ 实现转换为 Java。当我运行 Java 代码时,我没有得到预期的输出 我的 C++ 代码的预期: Minimum distance for source v
我是一名优秀的程序员,十分优秀!