一、深度优先搜索DFS 要递归
void DFS(int index,int sum,...)
- 先写死胡同(有可能有多个)
if(到达死胡同){
更新结果; //如果不需要更新直接return
return; //直接写return即可
}
- 再写岔道口
DFS(index+1,sum+wegiht[index],...) //选的分支
DFS(index,sum,...) //不选的分支
- 在基础上增加保存结果时:
不选的分支不用pop 好好体会
temp.push_back(index);
DFS(index+1,sum+wegiht[index],...) //选的分支
temp.pop_back(); //选的分支结束后及时pop 不要影响不选的分支
//不选的分支不用pop 好好体会
DFS(index,sum,...) //不选的分支
- 例题
A1103 重点 测试点4 :1 1 2
二、广度优先搜索BFS 队列
- 模板
void BFS(int s) {
queue<int> q;
q.push(s);
while (!q.empty()) {
int front=q.front(); //取出队首元素
访问队首元素;
q.pop(); //队首元素出队
for(int i=0;i<front.size();i++){
q.push(front.child[i]);
layer=front.layer+1; //设置层号
inq[front.child[i]]=true; //将下一层结点未入队的全部入队,并设置已入队;
}
}
- 为了避免出错,最好将编号入队而不是元素本身