Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
121
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.21 KB | None | 0 0
  1. from collections import deque, namedtuple
  2.  
  3. class Path:
  4.     def __init__(self, distance, previous):
  5.         self.distance = distance
  6.         self.previous = previous
  7.     def __str__(self):
  8.         return str([self.distance, self.previous])
  9.     def __repr__(self):
  10.         return str([self.distance, self.previous])
  11.  
  12.  
  13. inf = float('inf')
  14. Edge = namedtuple('Edge','start, end, cost')
  15.  
  16. def make_edge(start, end, cost = 1):
  17.     return Edge(start,end,cost)
  18.  
  19. class Graph:
  20.     def __init__(self,edges):
  21.         self.edges = []
  22.         for edge in edges:
  23.             self.edges.append(make_edge(*edge))
  24.  
  25.     @property
  26.     def vertices(self):
  27.         x = set() #unordered unique list {}
  28.         #sum(([edge.start, edge.end] for edge in self.edges), [])
  29.         for edge in self.edges:
  30.             x.add(edge.start)
  31.             x.add(edge.end)
  32.         return  x
  33.  
  34.     # def getEdge(self, n1, n2):
  35.     #     A = [[n1,n2],[n2,n1]]
  36.     #     for edge in self.edges:
  37.     #         if [edge.start, edge.end] in A:
  38.     #             return edge
  39.     #     return None
  40.     # def remove_edge(self, n1, n2):
  41.     #     edge = self.getEdge(n1,n2)
  42.     #     if edge is not None:
  43.     #         self.edges.remove(edge)
  44.     # def add_edge(self, n1, n2, cost =1):
  45.     #     edge = self.getEdge(n1,n2)
  46.     #     print(edge)
  47.     #     if edge is not None:
  48.     #         return ValueError('Edge {} {} already exists'.format(n1,n2))
  49.     #     self.edges.append(Edge(start = n1, end = n2, cost = cost))
  50.  
  51.     def getNeighbours(self, vertex):
  52.         neighbours = {}
  53.         for edge in self.edges:
  54.             if edge.start == vertex:
  55.                 neighbours[edge.end] = edge.cost
  56.             elif edge.end == vertex:
  57.                 neighbours[edge.start] = edge.cost
  58.         return neighbours
  59.  
  60.     def dijkstra(self, source, dest):
  61.  
  62.         paths = {}
  63.         unvisited = []
  64.         for vertex in self.vertices:
  65.             paths[vertex] = Path(inf,None)
  66.             unvisited.append(vertex)
  67.         paths[source].distance = 0
  68.         currentVertex = source
  69.         while unvisited:
  70.             neighbours = self.getNeighbours(currentVertex)
  71.  
  72.             nextVertex = None
  73.             nextVertexCost = inf
  74.             for neighbour, edgeCost in neighbours.items():
  75.                 if(paths[neighbour].distance > paths[currentVertex].distance + edgeCost):
  76.                     paths[neighbour].distance = paths[currentVertex].distance + edgeCost
  77.                     paths[neighbour].previous = currentVertex
  78.  
  79.                 if neighbour in unvisited:
  80.                     if(edgeCost <= nextVertexCost):
  81.                         nextVertex = neighbour
  82.                         nextVertexCost = edgeCost
  83.  
  84.             if(unvisited):
  85.                 unvisited.remove(currentVertex)
  86.                 currentVertex = nextVertex
  87.         return paths
  88.  
  89. graph = Graph([
  90.     ("a", "b", 7),  ("a", "c", 9),  ("a", "f", 14), ("b", "c", 10),
  91.     ("b", "d", 15), ("c", "d", 11), ("c", "f", 2),  ("d", "e", 6),
  92.     ("e", "f", 20)])
  93.  
  94.  
  95.  
  96. paths = graph.dijkstra("a", "e")
  97. print(paths)
  98. key = 'e'
  99. result = ''
  100. while key is not None:
  101.     result = key + result
  102.     key = paths[key].previous
  103. print(result)
  104. print("Cost: " + str(paths['e'].distance))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement