6.5图的遍历
遍历的定义
- 从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每个顶点仅被访问一次
遍历的实质
- 找每个顶点的邻接点的过程
图常用的遍历
- 深度优先搜索(DFS)
- 广度优先搜索(BFS)
6.5.1深度优先搜索(DFS)
例题
DFS的算法实现
1、邻接矩阵
若邻接矩阵给定,则DFS的结果也一定
非连通图的深度遍历
思路:当一个连通分量被访问完以后,从其他剩余分量再找一个继续访问
6.5.2广度优先搜索(BFS)
算法实现
DFS与BFS的算法效率比较
6.6图的应用
6.6.1最小生成树
生成树:
- 特点
- 1、生成树的顶点个数与图的顶点个数相同
- 2、生成树是图的极小连通子图,去掉一条边则非连通
- 3、一个有n个顶点的连通图的生成树有n-1条边
- 4、在生成树再加一条边必然形成回路
最小生成树
举例
构造最小生成树(MST——贪心算法)
1构造最小生成树的方法一:普里姆(Prim)算法
算法思路:
总结:先任一找一个结点,找其与剩余结点权值最小的边连线,接着以这两个结点为基准,找其与剩余结点权值最小的边连线,以此类推
2构造最小生成树的方法二:克鲁斯卡尔(Kruskal)算法
算法思路:
总结:
1、先把所有顶点拿出来,找其中权值最小的进行连线,依次类推,注意不能形成回路
2、所生成的最小生成树可能不唯一
两种算法的比较
6.6.2最短路径
第一类问题:两点间最短路径
第二类问题:某源点到其他各点最短路径
两种常见的最短路径问题
- 1、单源最短路径——用Dijkstra(迪杰斯特拉)算法
- 2、所有顶点间的最短路径——用Floyd(弗洛伊德)算法
最短路径——Dijkstra算法
总结:
1、dijkstra算法是单源求最短路径,始终以该店为源点
2、求到其他点的最短路径时,不可以把没有包含再S中的顶点路过
3、每次选取的点都是最短路径点
所有顶点间的最短路径方法——Floyd算法
方法一:每次以一个顶点为源点,重复执行Dijkstra算法n次
方法二:Floyd算法
算法思想
例题
6.6.3拓扑排序
有向无环图(DAG):无环的有向图,简称DAG图
1.拓扑排序——AOV网(以顶点表示活动)
特点
拓扑排序
拓扑排序的方法:
检测AOV网中是否存在环的方法:
对有向图构造其顶点的拓扑有序排列,若网中所有顶点都在它的拓扑有序序列中,则该AOV网必定不存在环。
2.关键路径——AOE网(以边表示活动)
定义四个描述量
例题1
总结:
1、求事件的最短时间:到最后结点的所有路径中权值最大的值;(从前往后)
2、求事件的最长时间:知道了该结点的最短时间 减去 上一结点的权值 取最小的那个值(从后往前)
3、求活动的最短时间:该活动”弧头“前事件所对应的时间,再之前的表格中找
4、求活动的最长时间:该活动“弧尾”后事件所对应的时间 减去 该活动的权值