算法-图解

 

图的临界矩阵

图的定义
• 图是由顶点(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', [])])

        

  

posted @ 2020-08-03 23:43  进阶的淑琴  阅读(179)  评论(0)    收藏  举报