深度优先搜索

来源:互联网 发布:linux查看当前用户命令 编辑:程序博客网 时间:2024/06/15 19:34

深度优先搜索就是有多远就走多远,能滚到哪就滚到哪大笑

这个思想是从头访问一个点,输出这个点,然后把这个点标记为已读,找到与他相连的任意一个点,再次进行此操作,递归

挺好理解的哈

给个例子:


伪代码:


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指向下一个边结点

 }

}




0 0
原创粉丝点击