Skip to content

Instantly share code, notes, and snippets.

@junjiah
Created August 30, 2015 14:03
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save junjiah/4e7fd44ed019b62bb0d6 to your computer and use it in GitHub Desktop.
Save junjiah/4e7fd44ed019b62bb0d6 to your computer and use it in GitHub Desktop.
solved 'Breadth First Search: Shortest Reach' on hackerrank https://www.hackerrank.com/challenges/bfsshortreach
from collections import namedtuple
# A reasonable large number to represent infinity.
INF = (1 << 31)
UNIT_LENGTH = 6
# Struct for edges.
Edge = namedtuple('Edge', ['src', 'dest'])
def calculate_shortest_distances(node_num, edges, src):
"""Bellman-Ford Algorithm.
node_num: Number of nodes.
edges: A list of edges.
src: Source node."""
# Index starts from 1.
dist = [INF] * (node_num + 1)
dist[src] = 0
for _ in range(node_num):
# A flag indicating whether update happens.
updated = False
for edge in edges:
edge_src, edge_dest = edge
if dist[edge_src] + UNIT_LENGTH < dist[edge_dest]:
updated = True
dist[edge_dest] = dist[edge_src] + UNIT_LENGTH
if not updated:
# Early exit since distances are now stable.
break
# Perform certain transformations on the output.
del dist[src]
del dist[0]
return [(-1 if i == INF else i) for i in dist]
if __name__ == '__main__':
test_case_num = int(raw_input())
for _ in range(test_case_num):
edges = []
node_num, edge_num = map(int, raw_input().split())
for _ in range(edge_num):
edge_src, edge_dest = map(int, raw_input().split())
# Note this is an undirected graph.
edges.append(Edge(edge_src, edge_dest))
edges.append(Edge(edge_dest, edge_src))
src = int(raw_input())
dist = calculate_shortest_distances(node_num, edges, src)
print ' '.join(map(str, dist))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment