數據結構與算法-圖(深度優先搜索bfs)

昨天說完了圖的存儲結構,今天開始圖的遍歷算法啦,無論是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);
	 } 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章