图算法
一. 认识图
• 图定义
图(Graph)形结构中,是一种非线性结构,在图中每一个元素都可以有0或多个前驱,也可以有多个后驱。节点之间的关系是任意的,即图中任意两个数据元素之间都有可能相关。
• 图的术语表
- 顶点
- 边
- 度数:注意有向图分出度和入度
- 路径
- 有向图、无向图
• 图的表示
- 邻接矩阵表示法
- 邻接表表示法
- 边集数组:
边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息。这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成。。
二 . 图算法
从图的某个定点触发访问遍图中所有的顶点,且每个顶点仅被访问⼀次。
• 广度优先搜索算法 BFS
- 首先访问出发点Vi。
- 接着依次访问Vi的所有未被访问过的邻接点Vi1,Vi2,Vi3,…,Vit并均标记为已访问过。
- 然后再按照Vi1,Vi2,… ,Vit的次序,访问每一个顶点的所有未曾访问过的顶点并均标记为已访问过,依此类推,直到图中所有和初始出发点Vi有路径相通的顶点都被访问过为止。
- 准备⼯作:创建⼀个 visited数组,⽤来记录已被访问过的定点;创建⼀个队 列,⽤来存放每⼀层的定点;初始化图 G
- 从图中的v0开始访问,将对应的 visited[v0]数组的值设置为 true,同时将v0⼊ 队列。
- 只要队列不空,则重复如下操作 :
- 队头定点u出队
- 依次检查u的所有邻接定点 w,若visited[w]的值为false,则访问w,并将visited[w]置为true,同时将w⼊队
• 深度优先搜索算法 DFS
1.从图中v0出发,访问v0。
2.找出v0的第一个未被访问的邻接点,访问该顶点。以该顶点为新顶点,重复此步骤,直至刚访问过的顶点没有未被访问的邻接点为止。
3.返回前一个访问过的仍有未被访问邻接点的顶点,继续访问该顶点的下一个未被访问领接点。
4.重复2,3步骤,直至所有顶点均被访问,搜索结束。
- 假设初始状态是图中所有顶点都未曾访问过,则可从图G中任意一顶点v为初始出发点,首先访问出发点v0,并将其标记为已访问过。
- 然后依次从v出发搜索v的每个邻接点v1,v2,v3,若w未曾访问过,则以w作为新的出发点出发,继续进行深度优先遍历,直到图中所有和v有路径相通的顶点都被访问到。
- 若此时图中仍有顶点未被访问,则另选一个未曾访问的顶点作为起点,重复上述步骤,直到图中所有顶点都被访问到为止。
- 具体步骤:创建⼀个 visited数组,⽤于记录所有被访问过的定点。从图中v0触发,访问 v0。
- 从图中v0触发,访问 v0。找出v0的第⼀个未被访问的邻接点。访问该顶点。以该顶点为新顶点,重复此步骤,直⾄刚访问过的顶点没有未被访问的邻接点为⽌。
- 返回前⼀个访问过的仍有未被访问邻接的顶点,继续访问该顶点的下⼀个未被访问的邻接点。重复以上步骤,直⾄所有顶点均被访问,搜索结束 。
- 一个顶点如果没有 未被访问过的邻接点(它的邻接点都被访问过一次),则返回上一个顶点。
• 拓扑排序算法
- 拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。
- 该序列必须满足下面两个条件:
- 每个顶点出现且只出现一次
-- 若存在一条从顶点 1到顶点 3 的路径,那么在序列中顶点 1出现在顶点 3 的前面。
• 最小生成树算法 Prim(普里姆)算法
- 图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树.
- 记住一句话:由任何一个顶点出发找到该点的所有边,再从边中找最小的边,拿最小边的to顶点再去找边,放到集合里,在从最小边集合中拿边找顶点;在找边,一直循环,直到找到所以的顶点 结素。生成最小生成树。
•