鄰接表儲存圖的DFS/BFS詳解
阿新 • • 發佈:2018-12-15
注 :關於鄰接表的建立,輸出連結
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