图算法

127 阅读4分钟

图算法

一. 认识图

• 图定义

图(Graph)形结构中,是一种非线性结构,在图中每一个元素都可以有0或多个前驱,也可以有多个后驱。节点之间的关系是任意的,即图中任意两个数据元素之间都有可能相关。 



• 图的术语表

- 顶点

- 边

- 度数:注意有向图分出度和入度

- 路径

有向图、无向图

• 图的表示

- 邻接矩阵表示法

image.png  - 邻接表表示法

image.png  

  • 边集数组:

边集数组是由两个一维数组构成。一个是存储顶点的信息;另一个是存储边的信息。这个边数组每个数据元素由一条边的起点下标(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⼊队

 

image.png  

• 深度优先搜索算法 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的第⼀个未被访问的邻接点。访问该顶点。以该顶点为新顶点,重复此步骤,直⾄刚访问过的顶点没有未被访问的邻接点为⽌。

   - 返回前⼀个访问过的仍有未被访问邻接的顶点,继续访问该顶点的下⼀个未被访问的邻接点。重复以上步骤,直⾄所有顶点均被访问,搜索结束 。

 

   - 一个顶点如果没有 未被访问过的邻接点(它的邻接点都被访问过一次),则返回上一个顶点。

image.png

• 拓扑排序算法

  - 拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。

  - 该序列必须满足下面两个条件:

  - 每个顶点出现且只出现一次

 

      -- 若存在一条从顶点 1到顶点 3 的路径,那么在序列中顶点 1出现在顶点 3 的前面。

image.png

 

 

• 最小生成树算法   Prim(普里姆)算法

  - 图的生成树是它的一棵含有其所有顶点的无环连通子图。一幅加权图的最小生成树(MST)是它的一棵权值(树中所有边的权值之和)最小的生成树.

  - 记住一句话:由任何一个顶点出发找到该点的所有边,再从边中找最小的边,拿最小边的to顶点再去找边,放到集合里,在从最小边集合中拿边找顶点;在找边,一直循环,直到找到所以的顶点 结素。生成最小生成树。