搜索?

這個部分的知識點已經學過去很長時間了(???),可是因爲沒有通過統一標準的學習,總感受本身並非徹底地掌握這一些東西,因此打算回顧一下,也是爲了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

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都是最經常使用的一種,在遍歷樹的時候通常都會優先選擇DFS(不少以BFS爲基礎的算法也有關於DFS的優化,並且每每很優)隊列

DFS就是在一個節點搜索完全(不能再向下)以後再去回溯到上一個狀態再進行完全地搜索,最終找到最優答案get

框架:

 

1,棧初始化
2,得到起點,將起點標識爲已走過,將起點入棧
while(棧非空){
  取棧頂元素vt
  若是vt周圍有爲走過的節點vf,則:
      將vf改成已走
      vf入棧
  沒有能走的節點,vt出棧
}
相關文章
相關標籤/搜索