图&BFS&DFS

图(Graph)的定义

图是由顶点的有穷非空集合和顶点之间的边的集合组成,通常
表示为: G(V,E)。其中,G 表示一个图,V 是图 G 中顶点的集合,E 是
图 G 中边的集合。例如图1是一个有五个顶点和7条边的图。


图1

图分类

image.png

图的存储

常用存储方式有4种: 邻接矩阵、邻接表、邻接多重表、十字链表.

邻接矩阵

图1邻接矩阵

邻接表

图1邻接表

邻接多重表

邻接多重表主要用于存储无向图。因为,如果用邻接表存储无向图,每条边的两个边结点分别在以该边所依附的两个顶点为头结点的链表中,这给图的某些操作带来不便。例如,对已访问过的边做标记,或者要删除图中某一条边等,都需要找到表示同一条边的两个结点。因此,在进行这一类操作的无向图的问题中采用邻接多重表作存储结构更为适宜。
边结点结构


邻接多重表边结点

其中mark表示标志位,用于标记该边是否已经被访问过;iVex和jVex表示该边的两个顶点在顶点数组adjmultiList[num]中的位置;iLink和jLink分别表示指向依附于顶点iVex和jVex下一条边的指针。


图1邻接矩阵表

十字链表

有向图的另一种链式存储。在十字链表中容易找到Vi的尾的弧,也容易找到以Vi为头的弧,因而容易求得顶点的出度和入度。

十字链表

存储的一些使用技巧参考

BFS

算法步骤:

  1. 找到一个未被访问的结点,并将该结点放入队列Q。
  2. 取队列中的一个结点,访问所有未被访问的邻居结点并将这些结点放入队列Q
    重复2直到队列Q为空,执行1,若仍存在未被访问结点,则继续执行2;若不存在,则bfs结束。

DFS

算法步骤:

  1. 找到一个未被访问的结点,访问该节点并将该节点加入栈S
  2. 取栈中的元素(不从栈中删除)v,访问未被访问的邻居结点t,将t入栈S。
    重复执行2直到栈空,再次执行1,若仍存在未被访问结点,则继续执行2;若不存在,则dfs结束。

你可能感兴趣的:(图&BFS&DFS)