dfs就是一个递归
简单模板:
void dfs(int u) { // st[u] = true; if(u > n) { if(条件) { 输出 } } //枚举 for(int i = 0; i < n; i ++ ) { if(!st[i]) { dfs(i); } } }
void dfs(int u) { st[u] = true; cout << u; //先序遍历 dfs(tree[u].l); dfs(tree[u].r) }
void dfs(int u) { st[u] = true; cout << u; for(int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if(!st[j]) dfs(j); } }
用途广泛,目前我所用到(之后再补充):
1.各种枚举:指数型,排列型,组合型.......
2.二叉树,图的遍历:二叉树是递归左右子树,图是递归邻接表......
基本思想:
一条路走到黑,深度优先,如果加上回溯和剪枝等等能够解决很多事情,比如走迷宫啦,暴力枚举等等。
bfs:
bfs不用递归,效率比较高,相对来说dfs只能枚举20以内的数据范围
queue<int> q; void bfs(int start) { q.push(start); st[start] = true; while(q.size()) { auto t = q.front(); q.pop(); for(int i = t; i <= n; i ++ ) { if(!st[i]) { st[i] = true; q.push(i); } } } }
用途也很广泛:
1.走地图(嘎嘎快)
2.最短路
3.遍历图和树
基本思想:
用队列入队、出队达到不用递归的目的,能够不用一头摸到黑,而是将每一层次都先遍历
谓之宽度优先。