深搜的算法思路
1. 算法用途:
遍历图中所有节点,同样适用于树的dfs,但树有一个连通分量(即树是连通图),而图则可能存在循环( 即同一节点会多次访问)或独立点,根据这一特性,为了避免多次访问则 在图的深搜问题中一般会设置访问标志;
2.实现过程:
用 1.邻接表
、2.标志变量st
,使用邻接表一般 dfs
的时间复杂度O(n+e) < 邻接矩阵O(n^2), 故选用。 st的设置用来判断一点是否访问过,避免重复访问同一节点从而造成死循环。
![img](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9wdXVpLnFwaWMuY24vZmFuc19hZG1pbi8wLzNfNzc1ODYzNTEyXzE1NzE4NDE3MzAwODAvMA?x-oss-process=image/format,png)
(邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集)
3.代码实现:
int h[N], e[N], ne[N], idx;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx;
}
int dfs(int u)
{
st[u] = true;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j]) dfs(j);
}
}
4.时间复杂度:
邻接表存图时间复杂度O(n+e), 对于 n(图的节点数): 因为深搜访问图每一个节点仅一次,故递归调用总次数为n,得到O(n), 对于 e(图的边数):邻接表存图,需要遍历该节点所有邻接点,得到O(e)。加之即得。
琢磨半月之久,今日得以总结。