图的遍历
作者:互联网
图的遍历
同树的遍历,图的遍历也是从一个顶点开始,逐个顶点遍历;但是图的结构相比树要复杂的多,在遍历的过程中,相比树也要复杂的多,因为图的每个顶点都有可能和其他顶点邻接,多以在比那里图的时候,需要注意的就包含是否该顶点被重复遍历了;所以这里就通过建立一个辅助数组,来记录每个顶点是否又被访问到;根据搜索路径的方向,一般将图的遍历路径分为:‘深度优先搜索’和‘广度优先搜索‘,均使用于优先图和无向图。
深度优先搜索
遍历方式: 从图中某个顶点开始,访问当前顶点,再查看点前顶点是否有未被访问的邻接点,如果有就访问对应的顶点,当遍历到当前顶点不再有未被访问的临接点时,就返回上一顶点,再次查看时候还有未被访问的临界点,重复之前的操作。
据图分析:
- 先访问顶点v1,然后查看到存在v2,v3两个未被访问的临接点,所以又将v2,作为新的顶点(习惯性从左边开始),重复之前的步骤;
- 在v2顶点访问之后,沿路径分别访问v4,v8,v5,然后发现v5没有未被访问的邻接点,返回到v8,再返回到v4,再返回到v2,再返回到v1,发现又存在未被访问的邻接点,继续重复之前的步骤;
算法实现
显然, 深度优先搜索遍历连通图是一个递归的过程。 为了在遍历过程中便千区分顶点是否已被访问,需附设访问标志数组 visited[n] , 其初值为 "false", 一旦某个顶点被访问,则其相应的分量置为 "true"。
连通图的遍历
bool visited[MVNum]; // 访问标志, 初值为false
void DFS(Graph G, int V) {
cout<<v; // 访问顶点
visited[v] = true;
for(int w = firstAdjVex(G,v); w >= 0; w = NExtAdjVex(G,v,w)) {
// firstAdjVex(G,v) 表示v的第一个邻接点
// NextAdjVex(G,v,w) 表示v相对于v的下一个邻接点,w>=0表示存在邻接点
if(!visited[w]) DFS(G,w);
}
}
非连通图的遍历
这里的遍历就是对连通图的遍历的二次封装,这里的非连通图遍历也适用于连通图;
void DFSTraverse(Graph G)
{//对非连通图G做深度优先遍历
for(v=O;v<G.vexnum;++v) visited[v]=false;
for(v=O;v<G.vexnum;++v) {
if(!visited[v]) DFS(G,v);
}
}
基于具体存储结构而定的遍历方式
邻接矩阵表示的深度优先遍历
void DFS_AM(AMGraph G, int v) {
cout<<v;
visited[v] = true;
for(int w = 0; w < G.vexNum; w++) {
if((G.arcs[v][w] != 0)&&(!visited[w])) DFS(G,w);
}
}
邻接表表示的深度优先遍历
void DFS_AL (ALGraph G, int v) {
cout << v;
visited[v] = true;
p = G.vertices[v].firstarc;
while(p != NULL) {
if(!visited[p->adjvex]) DFS (G,p->adjvex);
p = p->nextarc;
}
}
深度优先遍历,形似树的先序遍历,从一个顶点开始逐个遍历顶点,访问到底后就返回上一个顶点,继续查看是否有未被访问;
广度优先搜索
实现过程
- 从一个顶点开始,先访问前顶点,再访问对应的所有邻接点;
- 当当前顶点的所有邻接点都被访问之后,再进入第一个邻接点,查看对应是否存在未被访问的邻接点;
- 重复上诉步骤;
由此可以看出,图的这种遍历方式,同树的层序遍历还是很相似的;
’并使 “先被访问的顶点的邻接点“ 先于”后被访问的顶点的邻接点” 被访问‘ : 这是摘录自教材的一句话,开始读的时候,可能有些别扭,其实质就是像树的层序遍历,只有把一层遍历完了之后才遍历第二层。
算法实现
//
void BFS(Graph G, int v) {
cout << v;
visited[v] = true;
InitQueue(Q); // 采用队列: 辅助队列Q初始化,置空
EnQueue(Q,v); // v 进队
while(!QueueEmpty(Q)) {
DeQueue(Q,u); // u 出队
for(int w = FirstAdjVex(G,u); w >= 0; w = NextAdjVex(G,u,w)) {
if(!visited[w]) {
cout << w;
visited[w] = true;
EnQueue(Q,w);
}
}
}
}
以上均是个人总结,仅做参考。
标签:优先,遍历,连通,访问,邻接,顶点 来源: https://www.cnblogs.com/longyuan-ly/p/15881769.html