python图的广度遍历和深度遍历

参考:www.bilibili.com/video/BV1E4…

python实现

class Graph:
    def __init__(self, num):
        """
        vertexList: 存储顶点
        edges: 存储图的矩阵
        numOfEdges: 边的数量
        isVisited: 顶点是否被访问
        num: 顶点数量限制,决定edges规模,isVisited列表长度
        """
        self.vertexList = []
        self.edges = []
        for i in range(num):
            self.edges.append([0 for x in range(num)])
        self.numOfEdges = 0
        self.isVisited = [False for x in range(num)]
        self.limit = num

    def showGraph(self):
        for line in self.edges:
            print(line)

    def getNumOfEdges(self):
        return self.numOfEdges

    # 返回权值,0或1,0表示不通,1表示通
    def getWeight(self, x, y):
        return self.edges[x][y]

    # 添加顶点,受self.limit限制
    def insertVertex(self, vertex):
        if len(self.vertexList) <= self.limit:
            self.vertexList.append(vertex)
        else:
            print("vertexList数量已满,无法添加")

    def insertEdges(self, x, y, weight):
        self.edges[x][y] = weight
        self.edges[y][x] = weight
        self.numOfEdges += 1

    def getValueByIndex(self, index):
        return self.vertexList[index]

    def getFirstVertex(self, index):
        for j in range(0, len(self.edges)):
            if self.edges[index][j] > 0:
                return j
        return -1

    def getNextVertex(self, x, y):
        for j in range(y + 1, len(self.vertexList)):
            if self.edges[x][j] > 0:
                return j
        return -1

    def _dfs(self, index):
        print(self.getValueByIndex(index), end="->")
        self.isVisited[index] = True
        n = self.getFirstVertex(index)
        while n != -1:
            if not self.isVisited[n]:
                self._dfs(n)
            n = self.getNextVertex(index, n)

    def dfs(self):
        for i in range(len(self.vertexList)):
            if not self.isVisited[i]:
                self._dfs(i)

    def _bfs(self, index):
        queue = []
        print(self.getValueByIndex(index), end="->")
        queue.append(index)
        self.isVisited[index] = True
        while len(queue) != 0:
            u = queue.pop(0)
            w = self.getFirstVertex(u)
            while w != -1:
                if not self.isVisited[w]:
                    print(self.getValueByIndex(w), end="->")
                    self.isVisited[w] = True
                    queue.append(w)
                w = self.getNextVertex(u, w)

    def bfs(self):
        for i in range(len(self.vertexList)):
            if not self.isVisited[i]:
                self._bfs(i)


graph = Graph(5)
vertexList = ["A", "B", "C", "D", "E"]
for vertex in vertexList:
    graph.insertVertex(vertex)
print(graph.vertexList)
graph.insertEdges(0, 1, 1)
graph.insertEdges(0, 2, 1)
graph.insertEdges(1, 2, 1)
graph.insertEdges(1, 3, 1)
graph.insertEdges(1, 4, 1)
for line in graph.edges:
    print(line)
# graph.dfs()
graph.bfs()