第六章 图(二)

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、求活动的最长时间:该活动“弧尾”后事件所对应的时间 减去 该活动的权值 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Memorises1999

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值