DFS的复杂度分析:
对于邻接表的存储方式:因为邻接表中每条链表上的从第2个结点到表尾结点一定是表头结点的邻接点,所以遍历表头结点的邻接的过程中只需要遍历这些顶点即可,无需遍历其他的顶点,所以遍历某个顶点的所有邻接点的复杂度为O(ei),
ei为每个顶点的邻接点个数, 也就是每条链表的边数。 所以邻接表版的 dfs 遍历所有邻接点的时间复杂度为 O(e1 + e2 + e3 + .... + en) ,因为所有边数之和为 E , 所以时间复杂度为 O(E) , 又因为访问每个顶点都必须被访问一次, 比如设置vis[i] = true, 这个操作一共要执行 V 次,所以,设置所有顶点为已访问的时间复杂度为O(V), 所以总的时间为查找所有邻接点的时间加上设置每个顶点为已访问的时间,总的时间为 O(E) + O(V) = O(E + V)。
邻接表的 dfs 递归的最大深度就是 链表条数。最大深度的情况发生在 遍历第一条链表的第一个邻接结点时,发现它还未被访问过,所以递归访问它,而递归访问它的第一个邻接点又发现它还没被访问过,又会去递归访问这个邻接点,这样,每次递归开始查找到的都是未访问过的结点,每次都会进行向下递归,每次递归层数都加一,这样递归层数就为链表条数。