图——存储及遍历

本文介绍了图的定义,包括有向图、无向图、简单图和完全图等。接着讨论了图的存储方式,如邻接矩阵、邻接表、十字链表和邻接多重表。接着详细阐述了图的基本操作,如插入和删除顶点、边,以及获取边的信息。此外,还详细讲解了图的遍历算法,包括广度优先搜索(BFS)和深度优先搜索(DFS),并分析了它们的时间复杂度。最后提到了图的遍历在判断连通性和单源最短路径问题中的应用。
摘要由CSDN通过智能技术生成

图——存储及遍历

图的定义

定义:图G是由顶点集V和边集E组成,记为G=(V, E),其中V(G)表示图G
的顶点的非空有限集,E(G)表示图中的边的集合。顶点的个数称为图的阶。

基本概念:

  1. 有向图

  2. 无向图

  3. 简单图:如果图满如下条件则图称为简单图:(1)不存在重复边;(2)不存在顶点到自身的边;则称图为简单图。

  4. 多重图:若图G中某两个节点之间的边数对于一条,又允许顶点通过同一条边和自己相关联,则称图G为多重图。

  5. 完全图(也称简单完全图):无向图中如果任意两个顶点之间都有一条边相关联,则称图为无向完全图。在有向图中,如果任意两个顶点之间都存在方向相反的两条弧,则称该图为有向完全图。

  6. 子图

  7. 连通,连通图和连通分量:在无向图中,如果顶点v和w之间有路径存在,则称v和w是连通的,若图G中任意两个顶点都是连通的,则称图G为连通图,否则称为非连通图。无向图中的极大连通子图称为连通分量,如果图中有n个顶点,并且有小于n-1条边,则此图必是非连通图。

  8. 强连通图和强连通分量:在有向图中如果从顶点v到顶点w和从顶点w到顶点v之间都有路径,则称这两个顶点是强连通的。若图中任何一对顶点都是强连通的,则称此图为强连通图。

  9. 生成树,生成森林:生成树是包含图中所有顶点的一个极小连通子图,如果图中有n个顶点,则它的生成树含有n-1条边。

  10. 顶点的度,入度和出度:在无向图中,顶点的度等于边数的二倍;在有向图中度分为入度和出度,有向图中所有顶点的入度和出度之和都等于边数。

  11. 边的权和网:边上带有权值的图称为带权图,也称为网。

  12. 稠密图,稀疏图:一般当图G满足:|E| < |V|log(|V|)时,将图看成稀疏图。

  13. 路径,路径长度和回路:第一个顶点和最后一个顶点相同的路径称为回路或者环。

  14. 简单路径和简单回路:在路径序列中,顶点不重复出现的路径称为简单路径,除第一个顶点和最后一个顶点之外,其余顶点不重复的路径成为简单回路。

  15. 距离

  16. 有向树:有一个顶点入度为0,其余顶点入度为1的树称为有向树。

图的存储及基本操作

图的存储

  1. 邻接矩阵法

    用一个一位数组存储图中顶点的信息,用一个二维数组存储图中边的信息,存储顶点之间邻接关系的二维数组称为邻接矩阵。

    图的邻接矩阵的数据结构定义如下:

    #define MaxVertexNum 100          //顶点的最大数目
    typedef char VertexType;          //顶点的数据类型
    typedef int EdgeType;             //带权图上边的权值的数据类型
    typedef struct {
         
        VertexType Vex[MaxVertexNum]  //顶点表
        EdgeType Edge[MaxVertexNum][MaxVertexNum]  //边表
        int vexnum, edgenum;          //当前顶点数和边数
    }MGraph;
    

    稠密图适合邻接矩阵法。

  2. 邻接表法

    对图中的每一个节点建立一个单链表。
    顶点表节点由节点域(data)和指向第一条邻接边的指针firstarc构成,边表由邻接节点域adjvex和指向下一条邻接边的指针域nextarc构成。

    图的邻接表的数据结构定义如下:

    #define MaxVertexNum 100
    typedef struct ArcNode {
                  //  边表节点
        int adjvex;                  //  该弧指向的节点的顶点的位置
        struct ArcNode* nextarc;        //  指向下一条弧的指针
    } ArcNode;
    
    typedef struct VNode {
                    //顶点表节点。
        int data;
        struct VNode* firstarc;
    } VNode, AdjList[MaxVertexNum];
    
    typedef struct {
         
        AdjList vnode;                 //  邻接表
        int vernum, arcnum;
    } ALGraph;
    
  3. 十字链表
    在十字链表中很容易找到vi为结尾的弧,和以vi为头的弧。

  4. 邻接多重表

图的基本操作

  1. 判断图G是否存在无向边<v, w>或有向边(v, w);
  2. 列出图G中与x邻接的边;
  3. 在图G中插入顶点x;
  4. 在图G中删除顶点x;
  5. 如果无向边<v, w>或有向边(v, w)不存在则插入;
  6. 如果无向边<v, w>或有向边(v, w)存在,则删除此边;
  7. 求图G中顶点x的第一个邻接点;
  8. 获取图G中无向边<v, w>或有向边(v, w)对应的权值;
  9. 设置图G中无向边<v, w>或有向边(v, w)的权值。

图的遍历

广度优先搜索BFS

广度优先搜索需要借助一个队列来实现

1. 伪代码表示如下所示:

bool visited[MAX_VERTEX_NUM];
void BFSTraverse(Graph G) {
   
    for(int i = 0; i < G.vexnum, i++)
        visited[i] = false;

    for(int i = 0; i < G.vexnum, i++)
        if(!visited[i])
            BFS(G, i)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值