谈到算法,图的操作是避免不了。
而我们一般谈到图时,又必定会谈到图的遍历。
图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS)。
本篇博文讲解深度优先(DFS)。
图的表示
图有两种表示方式
1. 临接矩阵
其实就是一个权重矩阵,用 1 代表两个结点有连接,0 表示没有连接,这样的表示方式通俗易懂,特别适合稠密图,也就是大多数结点是亮亮连接的情况。
2. 临接表
用一个数组储存所有的顶点的信息,每个顶点又用一个链表或者是数组存放与它相临的结点的信息。
这样的表示方式特别适合稀疏图,也就是比较少的结点之间相互有连接。
本文示例代码用 Python 表示,为了简便,用临接表这种形式表示
DFS 算法思路
其实 DFS 的思路非常简单。
如果你哪天钱包忘记在哪里了,以 DFS 的思路就是,一个房间一个房间找。
先选定一个房间,大致扫一眼,发现没有。
然后,就选择房间里面的办公桌,桌子上没有的话,再去桌子上的柜子里面找。
如果桌子没有,就去床上着。
如果翻遍了所有的角落,也没有那就换个房间。
DFS 图例
上面是一张图,如果要遍历图中所有的结点,又不重复。
可以先选择一个顶点作为根结点,然后沿着路径一条一条遍历下去。
关键词是递归,因为递归需要终止条件,所以另外需要用一个数组记录已经访问过的结点,当一个结点它的临结点都已经访问时,它就需要回溯,这样能避免重复及陷入死循环。
我们首先选择 A.
A 有 2 个临接结点 B 和 C,我们选择先从 B 出发,所以此时路径是
A--->B
现在在 B 结点位置,B 有 3 个临接结点,C、D、F,按照优先往右边走的原则,我们选择 F,所以此时的路径是
A--->B--->F