Advertisement
Guest User

Untitled

a guest
May 4th, 2016
59
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.55 KB | None | 0 0
  1. # Enter your code here. Read input from STDIN. Print output to STDOUT
  2. class Graph:
  3. def __init__(self):
  4. self.nodes = set()
  5. self.edges = defaultdict(list)
  6. self.distances = {}
  7.  
  8. def add_node(self, value):
  9. self.nodes.add(value)
  10.  
  11. def add_edge(self, from_node, to_node, distance):
  12. self.edges[from_node].append(to_node)
  13. self.edges[to_node].append(from_node)
  14. self.distances[(from_node, to_node)] = distance
  15.  
  16.  
  17. def dijsktra(graph, initial):
  18. visited = {initial: 0}
  19. path = {}
  20.  
  21. nodes = set(graph.nodes)
  22.  
  23. while nodes:
  24. min_node = None
  25. for node in nodes:
  26. if node in visited:
  27. if min_node is None:
  28. min_node = node
  29. elif visited[node] < visited[min_node]:
  30. min_node = node
  31.  
  32. if min_node is None:
  33. break
  34.  
  35. nodes.remove(min_node)
  36. current_weight = visited[min_node]
  37.  
  38. for edge in graph.edges[min_node]:
  39. weight = current_weight + graph.distance[(min_node, edge)]
  40. if edge not in visited or weight < visited[edge]:
  41. visited[edge] = weight
  42. path[edge] = min_node
  43.  
  44. return visited, path
  45.  
  46. text= raw_input()
  47. nums = [int(n) for n in text.split()]
  48. towns = nums[0]
  49. linenums = nums[1]
  50. graph1.__init__(self)
  51. for i in range(0,towns):
  52. graph1.add_node(self, i)
  53.  
  54.  
  55. for i in range(0,linenums):
  56. temp = raw_input()
  57. bits = [int(n) for n in temp.split()]
  58. graph1.add_edge(self, bits[0], bits[1], bits[2])
  59.  
  60. for i in range(0,towns):
  61. route = dijsktra(graph1, i)
  62. print(route)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement