图里面的术语:

路径 :由边顺序连接的一系列订单。

简单路径 :一条没有重复顶点的路径。

:一条至少含有一条边且起点和终点相同的路径。

简单环 :一条(除了起点和终点必须相同之外)不含有重复顶点和边的环。

路径或者环的长度为其中所包含的边数。

当两个顶点之间存在一条连接双方的路径时,我们称一个顶点和另一个顶点时连通的。

连通图:如果从任意一个顶点都存在一条路径到达另一个任意顶点,我们称这幅图是连通图。

是一幅无环连通图。互不相连的树组成的集合称为森林。连通图的生成树是它的一幅子图,它含有图中的所有顶点且是一棵树。图的生成树森林是它的所有连通子图的生成树的集合。

树的密度:是指已经连接的顶点对占所有被连接的顶点对的比例。

稀疏图:被连接的顶点很少。

稠密图:只有少部分顶点对之间没有边连接。

树的表示方法

1、邻接矩阵:可以使用一个V乘V的布尔矩阵。当顶点v和顶点w之间有相连接的边时,定义v行w列的元素值为true,否则为false。稀疏图中空间浪费严重。

2、边的数组:使用一个Edge类,含有两个int实例变量。不方便图的操作(检查相邻边)。

3、邻接表数组:可以使用一个以顶点为索引的列表数组,其中的每个元素都是和该顶点相邻的顶点列表,这种数据结构可以克服上面的两种表示方法的缺点。

非稠密图的邻接表表示法

特点:

1、使用的空间和顶点数+边数成正比

2、添加一条边所需的时间为常数

3、遍历顶点v的所有相邻顶点所需的时间和v的度数成正比(处理每个相邻顶点所需的时间为常数)

深度优先搜索

深度优先搜索中每条边都会被访问两次,且在第二次时总会发现这个顶点已经被访问过。这意味着深度优先搜索的轨迹可能会比你想象的长一倍。

深度优先搜索实例:

一幅无向图:

一幅无向图

它的邻接表表示:

无向图的邻接表表示

深度优先搜索轨迹描述:

深度优先探索详细轨迹

1、因为顶点2是0的邻接表的第一个元素且没有被标记过,dfs()标记该位置并且访问顶点2。

2、接下来,顶点0是2的邻接表的第一个元素且已经被标记过了,因此dfs()跳过了它,然后,顶点1是2的邻接表的第二个元素且没有被标记,调用fds()来标记并访问顶点1。

3、对于顶点1的访问和前面的有所不同:因为它的邻接表中的所有顶点(0和2)都已经被标记过了,因此不需要在进行递归了,方法从dfs(1)返回,下一条被检查的边时2-3,因此调用dfs()标记并访问顶点3.

。。。。后续同理。

深度优先探索可以用于查找两点之间的路径

广度优先搜索

解决的问题:最短路径问题

实现算法:使用一个队列来保存所有已经被标记过但其邻接表还未被检查过的顶点。先将起点加入队列,然后重复一下步骤直到队列为空:

1、取队列中的下一个顶点v并标记它;

2、将与v相邻的所有未被标记过的顶点加入队列。

你可能感兴趣的:(算法和数据结构)