邻接表存储图的DFS/BFS详解

注 :关于邻接表的创建,输出链接
https://blog.csdn.net/qq_42146775/article/details/84898997

理解DFS/BFS

在这里插入图片描述

算法

void BFS(这个节点)
{
 标记这个节点
 指向这个节点的第一个临界点
 while(节点!=NULL)
 {
  if(节点没有标记) BFS(这个节点)
  标记过 则 指向下一个节点
 }
}
void DFS(这个节点)
{
 标记这个节点
 节点进队
 while(队不空)
 {
  出队
  指向这个出队节点的第一个邻接点
  while(该节点 != NULL)
  {
   if (节点没有标记)
   {
    标记这个节点
    这个节点入队
   }
   标记过 则 指向下一个节点
  }
 }
}

具体代码

void DFS(AdjGraph *adjGraph,int v,int *m) 
{
  AdjNode *node;
  cout<<v<<" "<<endl;
  m[v]=1;
  node=adjGraph->headNode[v].FirstNode;
  while(node!=NULL)
  {
   if(m[node->AdjNodeNum]==0)
   DFS(adjGraph,node->AdjNodeNum,m);
   node=node->NextNode;
  }
}
void BFS(AdjGraph *adjGraph,int v,int *m)
{
 AdjNode *node;
 int a;
 SqQueue *qu;
 InitQueue(qu);
 m[v]=1;
 cout<<v<<" ";
  EnQueue(qu,v);
  while(!QueueEmpty(qu))
 {
  DeQueue(qu,a);
  node=adjGraph->headNode[a].FirstNode;
  while(node!=NULL)
  {
   if(m[node->AdjNodeNum]==0)
   {
    cout<<endl; 
    cout<<node->AdjNodeNum<<" ";
    m[node->AdjNodeNum]=1;
    EnQueue(qu,node->AdjNodeNum);
   }
   node=node->NextNode ;
  }
 }
}

非连通图的遍历

for(int i=0;i<n;i++)
DFS()/BFS

猜你喜欢

转载自blog.csdn.net/qq_42146775/article/details/84899131