昨天说完了图的存储结构,今天开始图的遍历算法啦,无论是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);
}
}