一、回溯
- 循环枚举
- 子集枚举
- 排列枚举
- 待分类
二、深度优先搜索DFS
- 例题
- 特点
- 比较好写
- 难题要学会剪枝
三、广度优先搜索BFS
- 例题
- 适用场景
- 通常给个二维地图让你走迷宫、找块什么的都是bfs更优
四、染色问题
五、记忆化搜索
- 介绍
- 在每一次dfs/bfs搜索时用一个vector数组存放经过的点(联通点),而这些联通点能到达格子的个数是相同的,只要在一次搜索之后将最后到达格子个数的值赋给这些点,然后在每一次询问时,看看该点是否访问过,如果没有访问过就再搜索一次最后输出值。
- 可选方法
- 并查集思想,创建爸爸数组,只要是搜索过的,都标记同一个爸爸,同一个爸爸在ans数组里
- 例题
- P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
- 用dfs要加记忆化,bfs则不用
- P1135 奇怪的电梯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
模板(参考acwing)
DFS:
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);
}
}
BFS:
queue<int> q;
st[1] = true; // 表示1号点已经被遍历过
q.push(1);
while (q.size())
{
int t = q.front();
q.pop();
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
if (!st[j])
{
st[j] = true; // 表示点j已经被遍历过
q.push(j);
}
}
}