一、遍历的定义
从已给的连通图中某一顶点出发,沿着一些边访遍图中所有的顶点,且使每一个顶点仅被访问一次,就叫做图的遍历,它是图的基本运算
二、图的特点
图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点
二、图常用的遍历
(1)深度优先搜索(DFS)
(2)广度优先搜素(BFS)
三、深度优先搜索
1.方法
(1)在访问图中某一起始顶点v后,由v出发,访问它的任一邻接顶点w1.
(2)再从w1出发,访问与w1邻接但还未被访问过的顶点w2;
(3)然后再从w2出发,进行类似的访问;
(4)如此进行下去,知道到达所有的邻接顶点都被访问过的顶点u为止;
(5)接着,退回一步,推到前一次刚访问过的顶点,看是否还有其他没有被访问的结点。
(6)如果有,则访问此顶点,之后再从次顶点出发,进行与前述类似的访问;
(7)如果没有,就再退回一步进行搜素。重复上述过程,直到连通图中所有顶点都被访问为止。
2.代码
代码如下(示例):
void DFS(AMGraph G,int y){
cout<<v;
visited[v]=true;
for(w=0;w<G.vexnum;w++)
if((G.arcs[v][w]!=0&&(!visited[w]))
DFS(G,W);
}
3.效率分析
用邻接矩阵来表示图,遍历图中的每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(n^2)。
用邻接矩阵来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。
代码如下(示例):
四、广度优先搜索
1.方法
从图的某一结点出发,首先依次访问该结点的所有邻接结点,vi1,vi2…再从这些顶点被访问的先后次序依次访问与他们相邻接的所有未被访问的顶点
重复此过程,直至所有顶点均被访问为止
2.代码
void BFS(Graph G,int v){
cout<<v;vistit[v]=true;
InitQueue(Q);
EnQueue(Q,v);
while(!QueueEmpty(Q)){
DeQueue(Q,u);
for(w=FirstAdjVew(G,u);
w>=0;
w=NextAdjVew(G,u,w);
if(!visited[w]){
cout<<w;visited[w]=true;
EnQueue(Q,W);
}
}
3.效率分析
用邻接矩阵来表示图,遍历图中的每一个顶点都要从头扫描该顶点所在行,时间复杂度为O(n^2)。
用邻接矩阵来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。
该处使用的url网络请求的数据。