数据结构—深度优先遍历广度优先遍历图遍历算法的应用
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构—深度优先遍历广度优先遍历图遍历算法的应用相关的知识,希望对你有一定的参考价值。
深度优先遍历
深度优先遍历的过程是从图中的某个初始点v
出发,首先访问初始点v
然后选择一个与顶点v
相邻且没被访问过的顶点w
以w
为初始顶点,再从它出发进行深度优先遍历
直到图中与顶点v
邻接的所有顶点都被访问过为止
显然这个遍历过程是一个递归过程
以邻接表为存储结构的深度优先遍历算法如下
(其中v
是初始点,visited
是一个全局数组,初始时所有元素均为0,表示所有顶点尚未被访问过)
代码实现
int visited[Max] = 0;
void DFS(AdjGraph *G,int v)
///深度优先遍历
ArcNode *p;
visited[v] = 1;
cout<<v;
p = G->adjList[v].firstArc;
while(p != NULL)
if(visited[p->adjvex] == 0)
DFS(G,p->adjvex);
p = p->nextarc;
对于具有
n
个顶点、e
条边的有向图或无向图,DFS算法对图中的每个顶点最多调用一次,因此其递归调用总次数为n
当访问某个顶点v时,DFS的时间主要花在从该顶点出发查找它的邻接点上
当采用邻接表表示图时,需要遍历该顶点的所有邻接点,所以DFS的总时间为O(n+e)
当采用邻接矩阵表示图时,需要遍历该顶点行的所有元素,所以DFS 的总时间为O(n²)
广度优先遍历
广度优先遍历的过程是首先访问初始点 v
接着访问顶点v的所有未被访问过的邻接点v1 v2 ...vt
然后再按照v1 v2 ...vt
的次序访问每一个顶点的所有未被访问过的邻接点
依此类推,直到图中所有和初始点ν
有路径相通的顶点都被访问过为止
以邻接表为存储结构,在用广度优先遍历图时需要使用一个队列
这里采用环形队列,以类似于二叉树的层次遍历方式来遍历图
对应的算法如下(其中,ν
是初始点)
代码实现
void BFS(AdjGraph *G,int v)
///广度优先遍历
int w,i;
ArcNode *p;
queue<int> q;
int visited[MAX];
for(i = 0;i<G->n;i++)
visited[i] = 0;
cout<<v;
visited[v] = 1;
q.push(v);
while(!q.empty())
q.push(w);
p = G->adjList[w].firstArc;
while(p != NULL)
if(visited[p->adjvex] == 0)
cout<<p->adjvex;
visited[p->adjvex] =1;
q.push(p->adjvex);
p = p->nextarc;
cout<<endl;
显然,对于具有
n
个顶点、e
条边的有向图或无向图
在 BFS 算法中每个顶点都进队一次
因此执行时间与 DFS相同 当图采用邻接表表示图时,BFS 的总时间为O(n+e)
当图采用邻接矩阵表示图时,BFS 的总时间为O(n²)
遍历算法的应用
假设图 G采用邻接表存储,设计一个算法输出图 G 中从顶点u 到σ的一条简单路径(假设图 G 中从顶点u到ν至少有一条简单路径)
采用深度优先遍历的方法
从顶点 u 出发找到顶点v的一条路径的过程
为此在深度优先遍历算法的基础上增加 v、path 和d 几个形参
其中 path 存放顶点u到v的路径,d 表示 path 中的路径长度,其初值为一1
当从顶点u遍历到顶点v后,输出path 并返回
代码实现
void OneSimplePath(AdjGraph *G,int u,int v,int path[],int d)
///简单路径
int w,i;
ArcNode *p;
visited[u] =1;
d++;
path[d] = u;
if(u == v)
for(i = 0;i<=d;i++)
cout<<path[i];
cout<<endl;
return;
p = G->adjList[u].firstArc;
while(p != NULL)
w= p->adjvex;
if(visited[w] == 0)
OneSimplePath(G,w,v,path,d);
p = p->nextarc;
以上是关于数据结构—深度优先遍历广度优先遍历图遍历算法的应用的主要内容,如果未能解决你的问题,请参考以下文章
数据结构与算法图遍历算法 ( 深度优先搜索 DFS | 深度优先搜索和广度优先搜索 | 深度优先搜索基本思想 | 深度优先搜索算法步骤 | 深度优先搜索理论示例 )