数据结构与算法-图(深度优先搜索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);
	 } 
} 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章