In [2]:
class Vertex:
def __init__(self, name):
self.name = name
def getName(self):
return self.name
def __str__(self):
return self.name
In [9]:
class Edge:
def __init__(self, src, dst, weight = 0):
self.src = src
self.dst = dst
self.weight = weight
def getSrc(self):
return self.src
def getDst(self):
return self.dst
def getWeight(self):
return self.weight
def __str__(self):
return str(self.src) + "->" + str(self.dst)
In [5]:
class Digraph:
def __init__(self):
self.vertices = set([])
self.edges = {}
def addVertex(self, vertex):
if vertex.getName() in self.vertices:
raise ValueError('Duplicate Vertex')
else:
self.vertices.add(vertex)
self.edges[vertex] = []
def addEdge(self, edge):
src = edge.getSrc()
dst = edge.getDst()
if not(src in self.vertices and dst in self.vertices):
raise ValueError('Vertex not in graph')
self.edges[src].append(dst)
def childrenOf(self, vertex):
return self.edges[vertex]
def hasVertex(self, vertex):
return vertex in self.vertices
def __str__(self):
res = ''
for k in self.edges:
for d in self.edges[k]:
res = res + str(k) + '->' + str(d) + '\n'
return res[:-1]
In [6]:
class Graph(Digraph):
def addEdge(self, edge):
Digraph.addEdge(self, edge)
rev = Edge(edge.getDestination(), edge.getSource())
Digraph.addEdge(self, rev)
In [10]:
def test1(kind):
vertices = []
for name in range(10):
vertices.append(Vertex(str(name)))
g = kind()
for n in vertices:
g.addVertex(n)
g.addEdge(Edge(vertices[0],vertices[1]))
g.addEdge(Edge(vertices[1],vertices[2]))
g.addEdge(Edge(vertices[2],vertices[3]))
g.addEdge(Edge(vertices[3],vertices[4]))
g.addEdge(Edge(vertices[3],vertices[5]))
g.addEdge(Edge(vertices[0],vertices[2]))
g.addEdge(Edge(vertices[1],vertices[1]))
g.addEdge(Edge(vertices[1],vertices[0]))
g.addEdge(Edge(vertices[4],vertices[0]))
print('The graph:')
print(g)
test1(Digraph)
##test1(Graph)
In [ ]: