图的 深度遍历 广度遍历

//图的 深度遍历
//预先定义好的数据结构
//s : 表示顺序栈
//t : 表示栈顶指针
void dfs(int x)
{//从第x元素还是深度遍历
 int mark[n0+1]; //mark[i] = 0 表示这个点还没有被访问过
 int k; //用于遍历
 int s[n0+1],t;
 arcnode *p;
 //初始化
 for(k=0;k<=n;k++)
 {
  mark[k] = 0;
 }

 cout<<x<<” “;
 mark[x] = 1;

 //初始化栈
 t=1;
 s[1] = x; //

 do
 {
  k = s[t]; //得到栈顶元素所指节点
  p = adjlist[k].first; //p为与k连接的边的节点
  while(p && mark[p->vertext])
  {//如果p不空,而且当前p所指节点已经被访问,就继续找和k连接的节点。
   p = p->next;
  }

  if(p == NULL)
  {//如果和k邻接的节点都已经被访问过了,出栈
   t–;
  }
  else
  {//如果和k邻接的节点还有没有被访问的,就访问
   x = p->vertext;  //x是这个没被访问过的节点
   cout<<x<<” “;    //访问x
   mark[x] = 1 ;    //标记x也被访问过
   s[++t] = x;      //x被入栈
  }
 } while (t);
}

//图的 广度遍历
//预先定义好的数据结构
//q : 顺序队列
// f,r :队列首指针,队列尾指针
void bfs(int x)
{//从第x节点开始访问
 int mark[n0+1];  //标志点是否被访问过
 int k;
 int q[n0+1];  //队列
 int f;           //队列头
 int r;           //队列尾
 arcnode* p;      //临时的边节点
 
 //初始化mark数组
 for(k=1;k<=n;k++)
 {
  mark[k] = 0;
 }

 cout<<x<<” “;  //从x节点开始广度遍历
 mark[x] = 1;
 f = 1; //头指针,删除的位置
 r = 2; //尾指针,插入的位置
 q[f] = x; //插入队列

 do
 {
  k = q[f++]; //k为当前正在访问的节点,f头指针移动到正确的位置
  p = adjlist[k].first; //得到跟当前节点连接的第一条边
  while(p)
  {//当这条边不为空
   x = p->vertext;  //得到这条边上的节点
    if(mark[k] == 0)
    {//如果这个节点还没有被访问
     cout<<x<<” “;    //访问这个节点
     mark[x] = 1;     //设置这个节点被访问
     q[r++] = x;      //插入队列
    }
    p = p->next;
   
  }
 } while (f!=r); //当队列不为空

}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/tuwen/article/details/5279829
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞