数据结构 图 part2

  • Post author:
  • Post category:其他




图的遍历

在这里插入图片描述



深度优先遍历(DFS)



遍历步骤




在访问图中某一起始顶点v后,由v出发,访问它的任一邻接顶点w;




从w

1

出发,访问与w

1

邻接但还未被访问过的顶点w

2

;然后再从w

2

出发,进行类似的访问…




如此进行下去,直至到达所有的邻接顶点都被访问过的顶点u为止。




接着,退到前一次刚访问过的顶点,看是否还有其它未被访问的邻接顶点。

如果有,则访问此顶点,之后再从此顶点出发,进行与前述类似的访问;

如果没有,就再退回一步进行搜索。重复上述过程,直到连通图中所有顶点都被访问过为止。

在这里插入图片描述

注意:

在邻接表中,并非每个链表元素(表结点)都被扫描到,稀疏图时遍历速度较快。



邻接矩阵的存储

void DFS(AMGraph G,int v){//图G为邻接矩阵类型
    cout<<v;
    visited[v]=true;//访问第v个顶点
    for(w=0;w<G.vexnum;w++)//依次检查邻接矩阵v所在的行
        if((G.arcs[v][w]!=0)&&(!visited[w]))
            DFS(G,w);//w是v的邻接点,w未访问,递归调用
}

用邻接矩阵来表示图,遍历图中每一个顶点都要从头扫描该顶点所在行,时间复杂度为

O(n

2

)


稠密图适于在邻接矩阵上进行深度遍历



邻接表的存储

void DFS(ALGraph G, int v){//图G为邻接表类型
    cout<<v; 
    visited[v]=true;//访问第v个顶点
p= G.vertices[v].firstarc; //p指向v的边链表的第一个边
    while(p!=NULL){//边结点非空
        w=p->adjvex;//表示w是v的邻接点
        if(!visited[w]) DFS(G, w);//如果w未访问,则递归调用
        p=p->nextarc;//p指向下一个边结点
    }}

用邻接表来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为

O(n+e)


稀疏图适于在邻接表上进行深度遍历



广度优先遍历(BFS)



遍历步骤




在访问了起始点v之后,依次访问v的邻接点;




然后再依次访问这些顶点中未被访问过的邻接点;直到所有顶点都被访问过为止。

在这里插入图片描述

在这里插入图片描述



邻接矩阵

来表示图,对于每一个被访问到的顶点,都要循环检测矩阵中的整整一行( n个元素),时间复杂度为O(n

2

)。


稠密图适于在邻接矩阵上进行广度遍历



邻接表

来表示图,虽然有2e个表结点,但只需扫描e个结点即可完成遍历,加上访问n个头结点的时间,时间复杂度为O(n+e)。


稀疏图适于在邻接表上进行广度遍历



非连通图的遍历



连通分量

当无向图为非连通图时,从图中某一顶点出发,利用BFS算法或DFS搜索算法不可能遍历到图中的所有顶点,只能访问到该顶点所在

最大连通子图(连通分量)

的所有顶点。

非连通



向图的最大连通子图

在这里插入图片描述



如何遍历



从每个连通分量中选择初始点,分别进行遍历,才能够访问到图中的所有顶点。



生成树

该连通图的一个

极小连通子图

含有

n

个顶点,但只有构成一棵树的*(n-1)*条边;

使用不同的遍历方法,可以得到不同的生成树;

从不同的顶点出发,也可能得到不同的生成树;

在这里插入图片描述



版权声明:本文为qq_57682820原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。