dijkstra.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/python
  2. # -*- coding: utf-8 -*-
  3. class Node(object):
  4. """ A node. """
  5. def __init__(self, x, y, data):
  6. self._data = data # data connected to the node
  7. self._x = x # x-position
  8. self._y = y # y-position
  9. data = property(fget=lambda self: self._data)
  10. x = property(fget=lambda self: self._x)
  11. y = property(fget=lambda self: self._y)
  12. def __str__(self):
  13. return "{(%i,%i)/%s}" % (self.x, self.y, str(self.data))
  14. def __repr__(self):
  15. return "{(%i,%i)/%s}" % (self.x, self.y, str(self.data))
  16. class Edge(object):
  17. """ An edge. """
  18. def __init__(self, startNode, endNode, weight=0, directed=False):
  19. self._startNode = startNode
  20. self._endNode = endNode
  21. self._weight = weight
  22. self._directed = directed
  23. startNode = property(fget=lambda self: self._startNode)
  24. endNode = property(fget=lambda self: self._endNode)
  25. weight = property(fget=lambda self: self._weight)
  26. directed = property(fget=lambda self: self._directed)
  27. def __str__(self):
  28. return "%s/%s/%i" % (str(id(self.startNode)), str(id(self.endNode)), self.weight)
  29. def __repr__(self):
  30. return "%s/%s/%i" % (str(id(self.startNode)), str(id(self.endNode)), self.weight)
  31. class Graph(object):
  32. """ A graph. """
  33. def __init__(self, directed=False):
  34. self._directed = directed
  35. self._edges = []
  36. self._vertices = []
  37. directed = property(fget=lambda self: self._directed)
  38. edges = property(fget=lambda self: self._edges)
  39. vertices = property(fget=lambda self: self._vertices)
  40. def printVertices(self):
  41. vertexString = ""
  42. for vertex in self.vertices:
  43. vertexString += str(vertex)
  44. return vertexString
  45. def printEdges(self):
  46. edgeString = "% Connect vertices with edges and draw weights\n"
  47. edgeString += "\\foreach \source/ \dest /\weight in {"
  48. for i, edge in enumerate(self.edges):
  49. if i != 0:
  50. edgeString += ", "
  51. edgeString += str(edge)
  52. edgeString += "}\n"
  53. edgeString += "\path[edge] (\source) -- node[weight] {$\weight$} (\dest);"
  54. return edgeString
  55. def printGraph(self):
  56. print("\\begin{tikzpicture}[scale=1.8, auto,swap]")
  57. print("\\foreach \pos/\\name in {" + self.printVertices() + "}")
  58. print("\t\\node[vertex] (\\name) at \pos {$\\name$};")
  59. print(self.printEdges())
  60. print("\end{tikzpicture}")
  61. if '__main__' == __name__:
  62. graph = Graph()
  63. k1 = Node(1,2, 1)
  64. k2 = Node(3,0, 2)
  65. k3 = Node(3,3, 3)
  66. k6 = Node(1,4, 6)
  67. k5 = Node(4,5, 5)
  68. k4 = Node(5,3, 4)
  69. graph._vertices.append(k1)
  70. graph._vertices.append(k2)
  71. graph._vertices.append(k3)
  72. graph._vertices.append(k4)
  73. graph._vertices.append(k5)
  74. graph._vertices.append(k6)
  75. graph._edges.append(Edge(k1,k2, 7))
  76. graph.printGraph()