昨天說完了圖的存儲結構,今天開始圖的遍歷算法啦,無論是dfs和bfs都是重中之重,我們需要好好理解。
今天先開始bfs深度優先搜索算法,對於圖結構來說,任何兩個頂點都可能存在邏輯關係,我們不能用樹的遍歷方法,所以需要更加具有普遍性的算法,所謂圖的遍歷,就是從圖的一個節點出發,去訪問其餘任何一個頂點,並且每個頂點只訪問一次,從名字上就可以瞭解,深度搜索就是往深了去找,找到底,然後回溯,繼續找,直到全部找到。
規範來說,dfs是一個遞歸的過程,它從圖的某個頂點出發,訪問到的頂點做好標記,然後向未訪問到的鄰接點繼續訪問,如果訪問到頭了,依然沒有訪問到全部頂點,回溯到上一個頂點繼續向未標記的頂點走,直到算不頂點都訪問到,如果一直訪問結束依然沒有訪問全所有頂點,就需要換一個頂點重新遞歸。
請看源碼:
//鄰接矩陣深度遍歷
//單次深度遞歸
void DFS(MGraph G,int i)
{
int j;
visited[0]=true ;
cout<<G.vexs[i]<<' ';
for(int i=0;i<G.numVertexes;i++)
{
if(G.arc[i][j]==1&&!visited[j])
DFS(G,j);
}
}
//鄰接矩陣深度遍歷
void DFSTraverse(MGraph G)
{
int i;
for(i=0;i<G.numVertexes;i++)
{
if(!visited[i])
DFS(G,i);
}
}
//鄰接表的深度遍歷搜索
//鄰接表深度 遞歸
void DFS(GraphAdjList *GL,int i)
{
EdgeNode *p;
visited[i]=true;
cout<<GL->adjList[i].data<<' ';
p=GL->adjList[i].firstedge;
while(p)
{
if(!visited[p->adjvex])
DFS(GL,p->adjvex);
p=p->next;
}
}
void DFSTraverse(GraphAdjList *GL)
{
int i;
for(i=0;i<GL->numVertexes;i++)
{
if(!visited[i])
DFS(GL,i);
}
}