problem-solving-with-algorithms-and-data-structure-using-python 中文版
7 图和图的算法
顶点 边 权重 路径 循环
没有循环的图形称为非循环图
没有循环的有向图称为有向无环图或DAG。
图抽象数据类型如下:
- graph()创建一个新的空图
- addVerter(vert)向图中添加一个顶点实例
- addEdge(fromVert,toVert)向链接两个顶点的图加一个新的有向边
- addEdge(fromVert,toVert,weight)向连接两个顶点的图添加一个新的加权的有向边
- getVertex(vertKey)在图中找到名为vertKey的顶点
- getVertices()返回图中所有顶点的列表
- in返回True 如果vertex in graph,否则返回False
实现图的两种方式:邻接矩阵和邻接表
邻接矩阵:
邻接矩阵优点是简单,对于小图,很容易看到哪些节点连接到其他节点。但是大多数单元格是空的,即稀疏。
邻接表:是实现稀疏连接图更空间高效的方法。在邻接表实现中,我们保存Graph对象中所有顶点的主列表,然后图中每个顶点对象维护连接到它的其它顶点的列表。
邻接表实现的优点是允许我们紧凑地表示稀疏图。邻接表还允许我们容易找到直接连接到特定顶点的所有链接。
广度优先搜索BFS
深度优先搜索DFS
拓扑排序是深度优先搜索的简单但有用的改造。
拓扑排序采用有向无环图,并且产生所有其顶点的线性排序,使得如果图 G 包含边(v,w),则顶点 v 在排序中位于顶点 w 之前。定向非循环图在许多应用中使用以指示事件的优先级。
可以帮助找到图中高度互连的顶点的集群的一种图算法被称为强连通分量算法(SCC)。我们正式定义图 G 的强连通分量 C 作为顶点 C⊂V 的最大子集,使得对于每对顶点 v,w∈C,我们具有从 v 到 w 的路径和从 w 到 v 的路径。
一旦确定了强连通分量,我们就可以通过将一个强连通分量中的所有顶点组合成一个较大的顶点来显示该图的简化视图。
最短路径的算法:“Dijkstra算法”
Prim生成树算法