• Python实现数据结构 图


    邻接矩阵
    class Vertex:
        def __init__(self, node):
            self.id = node
            # Mark all nodes unvisited        
            self.visited = False  
    
        def addNeighbor(self, neighbor, G):
            G.addEdge(self.id, neighbor)
    
        def getConnections(self, G):
            return G.adjMatrix[self.id]
    
        def getVertexID(self):
            return self.id
    
        def setVertexID(self, id):
            self.id = id
    
        def setVisited(self):
            self.visited = True
    
        def __str__(self):
            return str(self.id)
    
    class Graph:
        def __init__(self, numVertices=10, directed=False):
            self.adjMatrix = [[None] * numVertices for _ in range(numVertices)]
            self.numVertices = numVertices
            self.vertices = []
            self.directed = directed
            for i in range(0, numVertices):
                newVertex = Vertex(i)
                self.vertices.append(newVertex)
    
        def addVertex(self, vtx, id):  #增加点,这个function没有扩展功能
            if 0 <= vtx < self.numVertices:
                self.vertices[vtx].setVertexID(id)
    
        def getVertex(self, n):
            for vertxin in range(0, self.numVertices):
                if n == self.vertices[vertxin].getVertexID():
                    return vertxin
            return None
    
        def addEdge(self, frm, to, cost=0): #返回全部连线/航线
            #print("from",frm, self.getVertex(frm))
            #print("to",to, self.getVertex(to))
            if self.getVertex(frm) is not None and self.getVertex(to) is not None:
                self.adjMatrix[self.getVertex(frm)][self.getVertex(to)] = cost
                if not self.directed:
                    # For directed graph do not add this
                    self.adjMatrix[self.getVertex(to)][self.getVertex(frm)] = cost  
    
        def getVertices(self):
            vertices = []
            for vertxin in range(0, self.numVertices):
                vertices.append(self.vertices[vertxin].getVertexID())
            return vertices
    
        def printMatrix(self):
            for u in range(0, self.numVertices):
                row = []
                for v in range(0, self.numVertices):
                    row.append(str(self.adjMatrix[u][v]) if self.adjMatrix[u][v] is not None else '/')
                print(row)
    
        def getEdges(self):
            edges = []
            for v in range(0, self.numVertices):
                for u in range(0, self.numVertices):
                    if self.adjMatrix[u][v] is not None:
                        vid = self.vertices[v].getVertexID()
                        wid = self.vertices[u].getVertexID()
                        edges.append((vid, wid, self.adjMatrix[u][v]))
            return edges
        
        def getNeighbors(self, n):
            neighbors = []
            for vertxin in range(0, self.numVertices):
                if n == self.vertices[vertxin].getVertexID():
                    for neighbor in range(0, self.numVertices):
                        if (self.adjMatrix[vertxin][neighbor] is not None):
                            neighbors.append(self.vertices[neighbor].getVertexID())
            return neighbors
        
        def isConnected(self, u, v):
            uidx = self.getVertex(u) 
            vidx = self.getVertex(v)
            return self.adjMatrix[uidx][vidx] is not None
        
        def get2Hops(self, u): #转一次机可以到达哪里
            neighbors = self.getNeighbors(u)
            print(neighbors)
            hopset = set()
            for v in neighbors:
                hops = self.getNeighbors(v)
                hopset |= set(hops)
            return list(hopset)

    邻接表
    import sys
    class Vertex:
        def __init__(self, node):
            self.id = node
            self.adjacent = {}
            #为所有节点设置距离无穷大
            self.distance = sys.maxsize
            # 标记未访问的所有节点     
            self.visited = False  
            # Predecessor
            self.previous = None
    
        def addNeighbor(self, neighbor, weight=0):
            self.adjacent[neighbor] = weight
    
        # returns a list 
        def getConnections(self): # neighbor keys
            return self.adjacent.keys()  
    
        def getVertexID(self):
            return self.id
    
        def getWeight(self, neighbor):
            return self.adjacent[neighbor]
    
        def setDistance(self, dist):
            self.distance = dist
    
        def getDistance(self):
            return self.distance
    
        def setPrevious(self, prev):
            self.previous = prev
    
        def setVisited(self):
            self.visited = True
    
        def __str__(self):
            return str(self.id) + ' adjacent: ' + str([x.id for x in self.adjacent])
        
        def __lt__(self, other):
            return self.distance < other.distance and self.id < other.id    
    
    class Graph:
        def __init__(self, directed=False):
            # key is string, vertex id
            # value is Vertex
            self.vertDictionary = {}
            self.numVertices = 0
            self.directed = directed
            
        def __iter__(self):
            return iter(self.vertDictionary.values())
    
        def isDirected(self):
            return self.directed
        
        def vectexCount(self):
            return self.numVertices
    
        def addVertex(self, node):
            self.numVertices = self.numVertices + 1
            newVertex = Vertex(node)
            self.vertDictionary[node] = newVertex
            return newVertex
    
        def getVertex(self, n):
            if n in self.vertDictionary:
                return self.vertDictionary[n]
            else:
                return None
    
        def addEdge(self, frm, to, cost=0):
            if frm not in self.vertDictionary:
                self.addVertex(frm)
            if to not in self.vertDictionary:
                self.addVertex(to)
    
            self.vertDictionary[frm].addNeighbor(self.vertDictionary[to], cost)
            if not self.directed:
                # For directed graph do not add this
                self.vertDictionary[to].addNeighbor(self.vertDictionary[frm], cost)
    
        def getVertices(self):
            return self.vertDictionary.keys()
    
        def setPrevious(self, current):
            self.previous = current
    
        def getPrevious(self, current):
            return self.previous
    
        def getEdges(self):
            edges = []
            for key, currentVert in self.vertDictionary.items():
                for nbr in currentVert.getConnections():
                    currentVertID = currentVert.getVertexID()
                    nbrID = nbr.getVertexID()
                    edges.append((currentVertID, nbrID, currentVert.getWeight(nbr))) # tuple
            return edges
        
        def getNeighbors(self, v):
            vertex = self.vertDictionary[v]
            return vertex.getConnections()

    引入的这两段代码的原文链接:
    https://www.cnblogs.com/kumata/p/9246502.html

  • 相关阅读:
    flash文件系统介绍
    二十五、linux内存映射
    Linux之Bootloader介绍
    环形队列
    二十四、USB协议
    二十三、uart串口协议
    一、嵌入式linux启动过程
    js中常见的错误类型
    vue中缓存组件keepalive及钩子函数activated的用法
    [英语单词]关于战争
  • 原文地址:https://www.cnblogs.com/hany-postq473111315/p/12871103.html
Copyright © 2020-2023  润新知