# graph.py: graph class based on lists
import sys

class Graph(object):
    def __init__(self):
        self._numV = 0 # num of vertices
        self._g = []
    # insert/put stuff ###############
    def insertVertex(self, d=None):
        self._numV += 1
        self._g.append([d, []])
    def insertEdge(self, u, v, d=None):
        self._g[u][1].append([v,d]);
    def putVertexData(self, v, d):
        self._g[v][0] = d
    def putEdgeData(self, u, v, d):
        # assumes unique edges
        for w in self._g[u][1]:
            if w[0] == v:
                w[1] = d
                return
    # get stuff ######################
    def getNumV(self):
        return self._numV
    def getVertexData(self, u):
        return self._g[u][0]
    def getEdgeData(self, u, v):
        for w in self._g[u][1]:
            if w[0] == v:
                return w[1]
        return None
    def getAdjList(self, u, d):
        ret = []
        if u < 0 or u >= self._numV:
            return None
        elif len(self._g[u][1]) == 0:
            return None
        else:
            t = len(self._g[u][1])
            for i in range(0,t):
                if self._g[u][1][i][1] == d:
                    ret.append(self.\
                      _g[u][1][i][0])
            return ret
    # print stuff ####################
    def printGraph(self):
        sys.stdout.write("g = [\n")
        for i in range(len(self._g)):
            sys.stdout.write(str(self._g[i])
              + ", # " + str(i) + '\n')
        sys.stdout.write("]\n")