4.17學習日誌

    昨天和今天開始做搜索的題目,進度略慢,昨天只做出一道題,今天也只做出一道,而且還都是似懂非懂的狀態。發現一個問題,從區間dp開始,一直屬於一種水過地皮溼的學習狀態,當時會了,再回頭一看,其實好多細節問題處理的不好,也就是沒有理解透徹。
      還是先說一下自己最近看的文章,關於DFS。           (1)算法原理          
      深度優先搜索即Depth First Search,是圖遍歷算法的一種。用一句話概括就是:“一直往下走,走不通回頭,換條路再走,直到無路可走”。          
      DFS的具體算法描述爲選擇一個起始點v作爲當前結點,執行如下操作:           
      a. 訪問 當前結點,並且標記該結點已被訪問,然後跳轉到b;           
      b. 如果存在一個和 當前結點 相鄰並且尚未被訪問的結點u,則將u設爲 當前結點,繼續執行a;          
      c. 如果不存在這樣的u,則進行回溯,回溯的過程就是回退 當前結點;         
      上述所說的當前結點需要用一個棧來維護,每次訪問到的結點入棧,回溯的時候出棧(也可以用遞歸實現,更加方便易懂)。        
    ( 2) 算法實現          
    深搜最簡單的實現就是遞歸,寫成僞代碼如下:   def DFS(v):    
    visited[v] = true    
    dosomething(v)     
    for u in adjcent_list[v]:          
    if visited[u] is false:                  
    DFS(u)          
    其中dosomething表示訪問時具體要乾的事情,根據情況而定,並且DFS是允許有返回值的。          
    另外還在CSDN上看到了一個很好的模板           void dfs()//參數用來表示狀態  
    {
          if(到達終點狀態)      
          {          ...//根據題意添加
                    return;
          }     
          if(越界或者是不合法狀態)          
          return;
          if(特殊狀態)//剪枝        
          return ;    
          for(擴展方式)      
          {
                    if(擴展方式所達到狀態合法)          
                    {          
                         修改操作;//根據題意來添加標記;              
                    dfs();              
                    (還原標記);    
                    //是否還原標記根據題意              
                    //如果加上(還原標記)就是 回溯法          
                     }     
           }  
    }         
    除此之外,DFS非遞歸實現涉及圖論的內容,也就不做深入瞭解了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章