I. 图的遍历
在数据结构中,图是比较常用的数据储存方式,同树结构一样,图的核心在于遍历的方法上,对于图的遍历,一般有两种方式,一种是深度优先遍历,一种是广度优先遍历。
II. 深度优先遍历(DFS)
深度优先是指设x是当前被访问顶点,在对x做过访问标记后,选择一条从x出发的未检测过的边(x,y)。若发现顶点y已访问过,则重新选择另一条从x出发的未检测过的边,否则沿边(x,y)到达未曾访问过的y,对y访问并将其标记为已访问过;然后从y开始搜索,直到搜索完从y出发的所有路径,即访问完所有从y出发可达的顶点之后,才回溯到顶点x,并且再选择一条从x出发的未检测过的边。上述过程直至从x出发的所有边都已检测过为止。此时,若x不是源点,则回溯到在x之前被访问过的顶点;否则图中所有和源点有路径相通的顶点(即从源点可达的所有顶点)都已被访问过,若图G是连通图,则遍历过程结束,否则继续选择一个尚未被访问的顶点作为新的顶点,继续遍历。
简单来讲,深度优先遍历可以理解为一个人开着汽车,从一点开始,接着寻找这点能够到达的其他点,若有,则开车到这个点,接着虚招下一个点,直到所有点都遍历完。
代码实现
intvisit[20]={0}; //路径访问数组
intmap[20][20]; //领接矩阵
void DFS(int xuhao , int n ) //顶点序号及顶点数
{
visit[xuhao]=1;
int i;
for( i = 0 ; i < n ; i++ )
{
if(visit[i]==0&&map[xuhao][i]!=0 )
DFS(i,n);
}
}
III. 广度优先遍历(BFS)
从图中某个顶点V0出发,并访问此顶点;从V0出发,访问V0的各个未曾访问的邻接点W1,W2,…,Wk;然后,依次从W1,W2,…,Wk出发访问各自未被访问的邻接点;重复上述步骤,直到全部顶点都被访问为止。
简单来讲,广度是范围型搜索,及确定好一个顶点过后,寻找与它距离最近的
集合,然后再继续寻找,直到所有点都遍历完。
代码实现
intvisit[20]={0}; //需要使用栈记录被访问顶点信息
intmap[20][20];
int tou =0,wei=0,dui[100];
void BFS(int x , int n )
{
dui[wei]=x;
int i ;
wei++;
visit[x]=1;
while( tou!=wei )
{
for( i = 0 ; i < n ; i++ )
{
if(visit[i]==0&&map[dui[tou]][i]!=0 )
{
cout<<s[i];
visit[i]=1;
dui[wei]=i;
wei++;
}
}
tou++;
}
}