DFS
顺序
递归
回溯:注意恢复现场
剪枝
- 提前判断当前子树一定不合法,不在继续搜索,直接回溯
- 当前路径最优,剪枝
相关习题:
cf 120F
解题思路:求所有蜘蛛长度的总和,DFS计算每个蜘蛛的长度即可。
vector<int> g[MAX];
int d,ind,h[MAX];
void Dfs(int v,int p=-1){
if(h[v] >= d){
ind=v;
d=h[v];
}
for(u:g[v]){
if(u != p){
h[u]=h[v]+1;
Dfs(u,v);
}
}
}
BFS
最短路
当所有边权都是1时可用BFS,但时间复杂度高,否则用最短路算法
DP是特殊的最短路(无环)
模板
queue ← 初始
while queue不空
{
t ← 队头
拓展 t
}
输出路径
typedef pair<int, int> PII;
PII Prev[N];
int x = n-1 , y = m-1;
while(x || y){
cout<<x<<' '<<y<<endl;
auto t = Prev[x][y];
x = t.first;
y = t.second;
}
技巧
上下左右四个方向拓展,用向量表示
↑ (-1,0)
→(0,1)
↓ (1,0)
←(0,-1)
区别 | 数据结构 | 空间 | 特点 | |
---|---|---|---|---|
DFS | stack | O(h) | 不具最短性 | 回溯、剪枝 |
BFS | queue | O(2h) | 最短路 |
1.11小结
-
《算法基础课》
-
组队练习补题
牛客小白月赛31
D 坐标计数 √
G 简单题的逆袭 √ -
牛客两题