其他分享
首页 > 其他分享> > 图的遍历

图的遍历

作者:互联网

图的遍历

同树的遍历,图的遍历也是从一个顶点开始,逐个顶点遍历;但是图的结构相比树要复杂的多,在遍历的过程中,相比树也要复杂的多,因为图的每个顶点都有可能和其他顶点邻接,多以在比那里图的时候,需要注意的就包含是否该顶点被重复遍历了;所以这里就通过建立一个辅助数组,来记录每个顶点是否又被访问到;根据搜索路径的方向,一般将图的遍历路径分为:‘深度优先搜索’和‘广度优先搜索‘,均使用于优先图和无向图。

深度优先搜索

遍历方式: 从图中某个顶点开始,访问当前顶点,再查看点前顶点是否有未被访问的邻接点,如果有就访问对应的顶点,当遍历到当前顶点不再有未被访问的临接点时,就返回上一顶点,再次查看时候还有未被访问的临界点,重复之前的操作。

image-20220211071020283

据图分析:

算法实现

显然, 深度优先搜索遍历连通图是一个递归的过程。 为了在遍历过程中便千区分顶点是否已被访问,需附设访问标志数组 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