1. 程式人生 > >鄰接表儲存圖的DFS/BFS詳解

鄰接表儲存圖的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