图遍历

图遍历简介

图的遍历是图中最基本的操作。图的遍历是指从图中的某一个顶点出发,对图中的所有顶点访问一次且只有一次。那么,自然而然的就会有下列几个问题:

1.      从何开始?

2.      从某个顶点出发可能到达不了所有的顶点,例如非连通图,如何才可以访问所有顶点?

3.      图中可能存在回路,产生重复访问问题

4.      一个顶点可能和多个顶点相连,如何选择访问下一个节点问题

 

解决方案:

(1)      的解决:

可以从任意顶点开始

 

(2)      的解决

多次从未被访问过的顶点开始遍历

 

Pseudocode:

for (i=0;i<n;i++)

如果顶点i没有被访问过,则从顶点i开始图的遍历;

 

(3)      的解决

设置一个访问标志数组visited[n],其初始值设为0,如果其中顶点已经被访问,则相应的数组元素设为1

 

Pseudocode:

for (i=0;i<n;i++)

if (visited[i]==0)从顶点i出发进行图的遍历;

 

(4)      的解决

解决如何选择下一个顶点的问题,有两种方式,分别为深度优先和广度优先

1.      深度优先遍历

<1>访问顶点v

<2>从v的未被访问的邻接顶点中选择下一个要访问的顶点w,从w出发进行深度优先遍历

<3>若顶底的邻接顶点已经全部被访问,将这个顶点出栈,退回上一个顶点,进行深度优先遍历

 

Pseudocode:

访问顶点v;

visited[v]=1;

w=顶点v的第一个邻接顶点;

while(w存在)

{

if(w未被访问)从顶点w出发递归执行该算法;

w=顶点v的下一个邻接顶点;

}

while(w不存在)

{

返回上一个顶点重复该算法;

}

 

2.      广度优先遍历

<1>访问顶底v

<2>依次访问顶点v的各个邻接顶点v1,v2,v3……

<3>分别从v1,v2,v3…出发依次访问它们未被访问的邻接顶点,并使“先被访问的顶点的邻接顶点”先于“后被访问的顶点的邻接顶点”被访问。直至所有的与顶底v有路径相通的顶点被访问到。

 

Pseudocode:

初始化队列Q;

访问顶点v;

visited[v]=1;

顶点v加入队列Q;

while(队列Q非空)

{

v出对;

w=顶点v的第一个邻接顶点;

while(w存在)

{

if(w未被访问)访问w;

visited[w]=1;

顶点w加入队列Q;

w=v的下一个邻接顶点;

}

}

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/qq_36642226/article/details/74855911
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞