宽度搜索和深度搜索

知识点总结报告模板

知识点:

宽度搜索

(原理)宽度搜索也是广度优先遍历

广度优先遍历的过程是首先访问初始点v,接着访问顶点v的所有未被访问过的领接点v1,v2,...,vt,然后再按照v1,v2,...,vt的次序访问每一个顶点的所有未被访问过的领接点,依次类推,直到图中所有和初始点v有路径相通的顶点都被访问过为止。

以领接表为存储结构,在用广度优先遍历图时需要使用一个队列,这里采用环形队列,以类似于二叉树的层次遍历方式来遍历图。算法如下(v是初始点):

void BFS(AdjGraph *G,int v)

{   int w,i;ArcNode *p;

  SqQueue *qu;         //定义环形队列指针

  InitQueue(qu);           //初始化队列

  int visited[MAXV];           //定义顶点访问标记数组

  for (i=0;i<G->n;i++) visited[i]=0;       //访问标记数组初始化

  printf(“%2d”,v);             //输出被访问顶点的编号

  visited[v]=1;                 //置已访问标记

  enQueue(qu,v);

  while(!=QueueEmpty(qu))             //队不空循环

  {   deQueue(qu,w);               //出队一个顶点w

      p=G->adjlist[w].firstarc;           //指向w的第一个领接点

     while(p!=NULL)               //查找w的所有领接点

    {   if (visited[p->adjvex]==0)         //若当前领接点未被访问

        {   printf(“%2d”,p->adjvex);       //访问该领接点

           visited[p->adjvex]=1;         //置已访问标记

           enQueue(qu,p->adjvex);       //该顶点进队

         }

        p=p->nextarc;         //找下一个领接点

    }

  }

  printf(“\n”);

}

深度搜索

(原理)深度搜索又叫深度优先遍历

深度优先遍历的过程是从图的某个初始点v出发,首先访问初始点v,然后选择一个与顶点v相邻且没被访问过的顶点w,以w为初始顶点,再从它出发进行深度优先遍历,直到图中与顶点v领接的所有顶点被访问过为止,这个遍历过程是递归过程。

以领接表为存储结构的深度优先遍历算法如下(其中v是初始点,visited是一个全局数组,初始时所有元素均为0,表示所有顶点尚未被访问过):

int visited[MAX={0};                          //全局数组

void DFS(AdjGraph *G,int v)         //深度优先遍历算法

{   ArcNode *p;

  visited[v]=1;               //置已访问标记

  printf(“%d”,v);             //输出被访问顶点的编号

  p=G->adjlist[v].firstarc;         //p指向顶点v的第一个领接点

  while(p!=NULL)

    {   if(visited[p->adjvex);       //若p->adjvex顶点未被访问,递归访问它

        DFS(G,p->adjvex);

      p=p->nextarc;             //p指向顶点v的下一个领接点

    }

}

 

posted @ 2018-02-10 13:09  珎珍  阅读(325)  评论(0编辑  收藏  举报