术语表
顶点Vertex (也称“节点Node" )是图的基本组成部分,顶点具有名称标识Key, 也可以携带数据项 payload
边 Edge (the "SMArc" ) 作为2个顶点之间关系的表示,边连接两个顶点; 边可以是无向或者有向的,相应的图称作“无向图”和“有向图”
权重Weight 为了表达从一个顶点到 另一个顶点的“代价” 可以给边赋权;例如公交网络中两个站点之间的 “距离”、“通行时间”和“票价”都可以作为 ” 权重。
图的实现:
邻接矩阵adjacency matrix
邻接表 adjacency list
两种方法各有优劣,需要在不同应用中加以选择
邻接矩阵:
邻接列表:
class Vertex:
def __init__(self,num):
self.id = num
self.connectedTo = {}
self.color = 'white'
self.dist = sys.maxsize
self.pred = None
self.disc = 0
self.fin = 0
# def __lt__(self,o):
# return self.id < o.id
def addNeighbor(self,nbr,weight=0):
self.connectedTo[nbr] = weight
class Graph:
def __init__(self):
self.vertices = {}
self.numVertices = 0
def addVertex(self,key):#添加顶点
self.numVertices = self.numVertices + 1
newVertex = Vertex(key)
self.vertices[key] = newVertex
return newVertex
def getVertex(self,n):#通过key查找顶点
if n in self.vertices:
return self.vertices[n]
else:
return None
采用先验的知识来改进算法性能的做法, 称作为启发式规则heuristic
图的应用:最短路径
【北京大学】数据结构与算法Python版(完整版)_哔哩哔哩_bilibili
最小生成树
- 广度优先搜索算法BFS,解决无权图的最短路径 问题(词梯问题);
- 带权图最短路径的Dijkstra算法;
- 图的深度优先搜索算法DFS(骑士周游问题);
- 用于简化图的强连通分支算法;
- 用于关联任务排序的拓扑排序算法;
- 用于广播消息的最小生成树算法。