深度優先搜索

深度優先搜索就是有多遠就走多遠,能滾到哪就滾到哪大笑

這個思想是從頭訪問一個點,輸出這個點,然後把這個點標記爲已讀,找到與他相連的任意一個點,再次進行此操作,遞歸

挺好理解的哈

給個例子:


僞代碼:


int    flag = 0;  // 這個就是標記量,標記有多少個已經走過了,如果這個flag == 總共的點數,那麼就代表程序輸出結束了

對象  point         //每個點是一個對象,屬性有連接的點的數組,一個int a變量標記是否已經走過,  0代表沒走過,1代表走過


先來一個遞歸的,直接寫的,不確定對不對啊,大體思路絕對沒問題的,反正也是僞代碼啊大笑

deep (point p)

{

       if(flag  ==  總共的點數)

         {

               //ok了,可以退出函數了

         }

 

       if(p.a == 0)

         {

              System.out.print(p);

              p.a = 1;

              flag ++;

              deep(一個連接他的點);

         }

      

        else

         {

             deep(返回上一個點);

         }

}

//這個程序在if的deep遞歸的時候中還需要一個操作,不能每次都遞歸那個連接點數組中的第一個,你每次都deep第一個那後面的能願意嗎?是吧,這個怎麼做沒寫,因爲有很多種方法,比如,每次先取出第一個,然後在數組中刪除等

//還有一個就是怎麼找到上一個點,這個隨便寫,也不說了


再寫一個循環的

while (true)

{

      if(flag  ==  總共的點數)

        {

              break;

         }

       if(p.a  ==  0)

         {

             System.out.print(p);

             flag++;

             p.a  = 下一個連接的點 ;

          }

       else

         {

             p.a = 上一個點;

          }

}

這個跟遞歸差不多,當然問題也差不多。。。


void DFS(ALGraph G, int v){          //G爲鄰接表類型

  cout<<v;  visited[v] = true;      //訪問第v個頂點

  p= G.vertices[v].firstarc;     //p指向v的邊鏈表的第一個邊結點

while(p!=NULL){                //邊結點非空

  w=p->adjvex;                 //表示wv的鄰接點

  if(!visited[w])  DFS(G,w);   //如果w未訪問,則遞歸調用DFS

  p=p->nextarc;                  //p指向下一個邊結點

 }

}




發佈了61 篇原創文章 · 獲贊 12 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章