关于深搜的算法思路

深搜的算法思路


1. 算法用途:
遍历图中所有节点,同样适用于树的dfs,但树有一个连通分量(即树是连通图),而图则可能存在循环( 即同一节点会多次访问)或独立点,根据这一特性,为了避免多次访问则 在图的深搜问题中一般会设置访问标志;

2.实现过程:
1.邻接表2.标志变量st,使用邻接表一般 dfs 的时间复杂度O(n+e) < 邻接矩阵O(n^2), 故选用。 st的设置用来判断一点是否访问过,避免重复访问同一节点从而造成死循环。

img

(邻接表是表示了图中与每一个顶点相邻的边集的集合,这里的集合指的是无序集)

3.代码实现:
// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点
int h[N], e[N], ne[N], idx;

// 添加一条边a->b
void add(int a, int b) 
{
	e[idx] = b, ne[idx] = h[a], h[a] = idx;    
}

int dfs(int u)
{
    st[u] = true; // st[u] 表示点u已经被遍历过

    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)。加之即得。

感谢这位博主 参考链接
琢磨半月之久,今日得以总结。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值