這個部分的知識點已經學過去很長時間了(???),可是因爲沒有通過統一標準的學習,總感受本身並非徹底地掌握這一些東西,因此打算回顧一下,也是爲了NOIP裏的分值(騙分)作準備qwq,畢竟考完就退役了qwq算法
本文基於此文qwq https://www.jianshu.com/p/1fc63ab1bcc2框架
先選擇某一種可能的狀況向前探索,在探索過程當中,一旦發現原來的選擇是錯誤的,就退回一步從新選擇,繼續向前探索,如此反覆進行,直到獲得解或證實問題無解。學習
有兩種框架:優化
int search(int x) { for(int i=1;i<=...;i++) { if(知足條件) { 保存結果; if(到目的地) 輸出解答; else search(x + 1); 回溯:恢復以前的狀態; } } } int search(int x) { if(到目的地) 輸出; else for(int i=1;i<=...;i++) { if(知足條件) { 保存結果; search(x + 1); 回溯:恢復以前的狀態; } } }
這就象徵了一個不斷修正前進的過程spa
bfs就相似於一層一層地向下搜索,開始下一層搜索的充要條件是本層必定所有搜索過一遍code
而後就不斷地向上傳遞本身下面的信息,從而達到每個點都遍歷過的過程orm
框架:blog
q.push(Start);//1,將起點推入隊列中; vis[Start] = true;//2,將起點標識爲已走過; while(q.empty())//(隊列非空) { int vt = q.top();//3,取隊列首節點vt,並從隊列中彈出; for(int i=head[vt];i;i=edge[i],next)//4,探索上面取出得節點的周圍是否有沒走過的節點vf { if(...) Node[vt].parent = Node[vf].parent }//若是有將全部能走的vf的parents(information)指向vt,並將vf加入隊列 if(vf == Finish) return vf;//(若是vf等於終點,說明探索完成,退出循環)。 } return -1;//若是隊列爲空天然跳出,說明無路可達終點
通常來講DFS都是最經常使用的一種,在遍歷樹的時候通常都會優先選擇DFS(不少以BFS爲基礎的算法也有關於DFS的優化,並且每每很優)隊列
DFS就是在一個節點搜索完全(不能再向下)以後再去回溯到上一個狀態再進行完全地搜索,最終找到最優答案get
框架:
1,棧初始化 2,得到起點,將起點標識爲已走過,將起點入棧 while(棧非空){ 取棧頂元素vt 若是vt周圍有爲走過的節點vf,則: 將vf改成已走 vf入棧 沒有能走的節點,vt出棧 }