DFS BFS

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)

区别数据结构空间特点
DFSstackO(h)不具最短性回溯、剪枝
BFSqueueO(2h)最短路

1.11小结

  • 《算法基础课》
    图1

  • 组队练习补题
    牛客小白月赛31
    D 坐标计数 √
    G 简单题的逆袭 √

  • 牛客两题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值