注:本学期刘老师算法设计分析课内容笔记
要一直坚持到最后都认认真真的人感觉很牛
另外悄咪咪吐槽一下老师后面的PPT都没有前面的好懂,当然也可能是因为后面我老走神没怎么听的缘故🤔
分支限界
装载问题分析🚩
广度优先搜索
- 使用队列
- 使用优先队列:
cw: 当前重量, r: 剩余重量, 改进: 优先队列
设计关键值key=cw+r, 按关键值选择扩展节点
约束条件 cw ≤ c,节点记录: (key;cw) //省略层号
蓝色节点不需要扩展: key是子树上cw的上界 //对比回溯
还可使用限界条件和提前更新最优值剪枝
- 分支限界
分支限界:上界key, 下界bestw, 关键值key
cw, r, bestw, key = cw + r, t //层号
==节点记录: (key; t, cw, r, bestw) ==
约束:cw≤c + 限界:key>bestw + 提前更新
结束: t>n或 队列空 或 上界=下界
总结:分支限界一般步骤
广度优先搜索
一般过程:
- 初始根节点是活节点(灰色,进队列), 其它节点白色
- while(true)
- 从队列取一个活节点, 设为扩展节点(红色)
- 将扩展节点的所有孩子设为活节点(灰色,进队列),
- 扩展节点设为死节点(黑色)
取活节点方式: 先进先出队列 或 优先队列
结束方式: 队列空 或 到达叶节点(需要设计)
节点: 四种颜色, 三种状态
在任意时刻只有一个扩展节点
Dijkstra: 优先队列或先进先出
输入: G=(V,E,w,s), w权, s起点;
输出: δ(s,·)
1. 初始d[s]=0, 其它d[u]=INF,
2. S,Q空, Q.add(s,0),
3. 当Q非空 //Q是优先队列
4. Q.delete(u), 若uS, continue(),
5. 将u添加到S中,
6. 任意v∈adj[u], 松弛(u,v),
7. 若d[v]改变, Q.add(v,d[v])
松弛(u,v): 若d[v]>d[u]+w[u,v], 则d[v]=d[u]+w[u,v