算法-图解
图的临界矩阵
图的定义
• 图是由顶点(Vertex)和边(Edge)构成
• 图可以分为有向图和无向图,无向图所有边都是双边的
• 顶点的度是指该顶点相连的边的条数,特别是对于有向图的边数称为顶点的出度,
顶点的入边条数称为该顶点的入度。
• 顶点和边都可以有一定的属性,量化的属性称为权值,顶点的权值和边的权值分别
称为点权和边权。
class Graph: def __init__(self): #图的最短路径(如何找到AB两点最短的距离) self.neighbor={} def add_node(self,node_name):#只是添加节点而已 """添加单个节点""" if node_name not in self.neighbor.keys(): self.neighbor[node_name]=[] def add_edge(self,node,neighbor_node,distance):#添加节点与节点之间的关系 """添加节点之间的关系—边 规划:如何存储节点与节点之间的关系存储,这里用元组来存储 {"pudong":[("hongqiao",20),("huanpu":10)]} :param node:节点A :param neighbor_node 节点B :param distance 节点A 节点B之间的关系(以距离 ) """ if node==neighbor_node: return #第一步:找出现有的node的相邻节点 """node_current_neighbor=[] for item in self.neighbor[node]: print(item.key()[0]) node_current_neighbor.append(item.key()[0]) print(node_current_neighbor)""" #以下为一句话代码解决 node_current_neighbor=[x[0] for x in self.neighbor[node]] #第二步:判断neighbor_node 是否已添加过 if neighbor_node not in node_current_neighbor: self.neighbor[node].append([neighbor_node,distance]) else: print("更新节点的关系") for idx,item in enumerate(self.neighbor[node]): if item[0]==neighbor_node: self.neighbor[node][idx][1]=distance def get_nodes(self): return self.neighbor.items() def bread_first_search(self,root): """广度优先遍历 :param root:待遍历的节点 :return:visited""" queue=[root]#记录待遍历的节点 visited=[] while queue: node=queue.pop(0) if node not in visited: visited.append(node) queue.extend(item[0] for item in self.neighbor[node]) print("当前节点:",node) print("待遍历节点",queue) else: print("已经遍历过的节点",node) return visited if __name__=="__main__": graph=Graph() graph.add_node("pudong") graph.add_node("hongqiao") graph.add_node("huangpu") graph.add_node("minghang") graph.add_node("sanlin") graph.add_node("linggang") graph.add_edge("pudong","hongqiao",20) graph.add_edge("pudong","huangpu",32) graph.add_edge("pudong","minghuang",21) graph.add_edge("pudong","hongqiao",23) graph.add_edge("pudong","linggang",22) graph.add_edge("pudong","sanlin",31) graph.add_edge("pudong","linggang",22) graph.add_edge("pudong","sanlin",31) print(graph.get_nodes()) # E:\pythonExcise>python 0803_pciture.py # 更新节点的关系 # 更新节点的关系 # 更新节点的关系 # dict_items([('pudong', [['hongqiao', 23], ['huangpu', 32], ['minghuang', 21], ['linggang', 22], ['sanlin', 31]]), ('hongqiao', []), ('huangpu', []), ('minghang', []), ('sanlin', []), ('linggang', [])])