算法-图解
图的临界矩阵
图的定义
• 图是由顶点(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', [])])

浙公网安备 33010602011771号