• 图的概述


      本文关于图的概述主要引自《新编数据结构习题与解析》(李春葆等著)第11章。

    1. 图的基本概念

    1.1 图

      图G由两个集合V和E组成,记为G=(V, E),其中V是顶点的有限非空集合,E是V中顶点偶对的有限集,这些顶点偶对 称为边。

    1.2 无向图

      在图G中,如果代表边的顶点偶对是无序的,则称G为无向图。

    1.3 有向图

      在图G中,如果表示边的顶点偶对是有序的,则称G为有向图。一个图要么为无向图,要么为有向图,不存在部分为有向图或无向图的情况。

    1.4 完全图

      若图中的每两个顶点之间都存在着一条边,称该图为完全图。完全有向图有n(n-1)条边,完全无向图有n(n-1)/2条边。

    1.5 端点和邻接点

      在一个无向图中,若存在一条边(i, j),则称顶点i和顶点j为该边的两个端点,并称它们互为邻接点。

      在一个有向图中,若存在一条边<i, j>,则称顶点i和j为该边的两个端点,也称它们互为邻接点,这里,顶点i为起点,顶点j为终点。

    1.6 顶点的度、入度和出度

      在无向图中,顶点所具有的边的数目称为该顶点的度。

      在有向图中,顶点v的度又分为入度和出度,以顶点v为终点的入边的数目,称为该顶点的入度;以顶点v为起点的出边的数目,称为该顶点的出度。一个顶点的入度和出度的和称为该顶点的度。在一个具有e条边的图中有:度之和为2e。

    1.7 子图

      设有两个图G=(V, E)和G'=(V', E'),若V'是V的子集,且E'是E的子集,则称G‘是G的子图。

    1.8 路径和路径长度

      在一个图G=(V, E)中,从顶点i到顶点j的一条路径是一个顶点序列(i, i1, i2, ..., im, j),若此图G是无向图,则边(i, i1), (i1, i2), ...(im, j) 属于E(G);若此图是有向图,则<i, i1>, <i1, i2>, ...<im, j> 属于E(G)。路径长度是指一条路径上经过的边的数目。若一条路径上除开始点和结束点可以相同外,其余顶点均不相同,则称此路径为简单路径

    1.9 树图

      任意两个顶点之间只有一条路径的无向连通图称为树图。n个顶点的树图恰好有n-1条边。

      对于一个含有V个结点的树图G,它满足以下几个条件(一个图满足以下条件之一就是一棵树):

      1)G有V-1条边且不含有环;

      2)G有V-1条边且是连通的;

      3)G是连通的,但删除任意一条边都会使它不再连通;

      4)G是无环图,但添加任意一条边都会产生一条环;

      5)G中的任意一对顶点之间仅存在一条简单路径。

    1.10 回路或环

      若一条路径上的开始点与结束点为同一个顶点,则此路径称为回路或环。开始点与结束点相同的简单路径被称为简单回路或简单环。

    1.11 连通、连通图和连通分量

      在无向图G中,若从顶点i到顶点j有路径,则称顶点i和顶点j是连通的。若图G中任意两个顶点都连通,则称G为连通图,否则称为非连通图。无向图G中的极大连通子图称为G的连通分量。显然,任何连通图的连通分量只有一个,即为自身,而非连通图可能有多个连通分量。

    1.12 强连通图和强连通分量

      在有向图G中,若从顶点i到顶点j有路径,则称从顶点i到顶点j是连通的。若图G中的任意两个顶点i和顶点j都连通,即从顶点i到顶点j和从顶点j到顶点i都存在路径,则称图G是强连通图。有向图G中的极大强连通子图称为G的强连通分量。显然,强连通图只有一个强连通分量,即自身,非强连通图有多个强连通分量。

    1.13 稠密图、稀疏图

      当一个图接近完全图时,则称为稠密图;相反,当一个图含有较少的边数(即当e<<n(n-1))时,则称为稀疏图。

    1.14 权和网

      图中每一条边都可以附有一个对应的数,这种与边相关的数称为权。权可以表示从一个顶点到另一个顶点的距离或花费的代价。边上带有权的图称为带权图,也称作网。

    2. 图的存储结构

      图有多种存储方式,其中最基本的两种存储方式为邻接矩阵和邻接表。

    2.1 邻接矩阵

      邻接矩阵是一种表示顶点之间邻接关系的矩阵。

      2.1.1 无向图

      设G=(V, E)是具有n个顶点的不带权无向图,则G的邻接矩阵是具有如下定义的n阶方阵A:

      A[i][j] = 1 :表示有边(i, j)

      A[i][j] = 0 :表示没有边(i, j)        (0 <= i, j <= n-1)

      A[i][i] = 0 :表示顶点i到自身没有边

      设G=(V, E)是具有n个顶点的带权无向图,则G的邻接矩阵是具有如下定义的n阶方阵A:

      A[i][j] = wij :表示有边(i, j),wij指边的权值

      A[i][j] = ∞ :表示没有边(i, j)        (0 <= i, j <= n-1)

      A[i][i] = 0 :表示顶点i到自身没有边

      如下图中,无向图9.1(a)对应的邻接矩阵为图9.1(b):

      

      2.1.2 有向图

      设G=(V, E)是具有n个顶点的不带权有向图,则G的邻接矩阵是具有如下定义的n阶方阵A:

      A[i][j] = 1 :表示有边<i, j>

      A[i][j] = 0 :表示没有边<i, j>        (0 <= i, j <= n-1)

      A[i][i] = 0 :表示顶点i到自身没有边

      设G=(V, E)是具有n个顶点的带权有向图,则G的邻接矩阵是具有如下定义的n阶方阵A:

      A[i][j] = wij :表示有边<i, j>,wij指边的权值

      A[i][j] = ∞ :表示没有边<i, j>        (0 <= i, j <= n-1)

      A[i][i] = 0 :表示顶点i到自身没有边

      邻接矩阵是图的顺序存储结构,从邻接矩阵的行数或列数可知图的顶点数,无向图的邻接矩阵总是对称的,有向图的邻接矩阵不一样是对称的。

      图的邻接矩阵存储结构的类型声明如下:

     1 #define    MAXV    <最大顶点个数>
     2 typedef char ElemType
     3 typedef struct
     4 {
     5     int no;                        // 顶点编号
     6     ElemType info;                 // 顶点其他信息
     7 }VertexType;                       // 顶点类型
     8 
     9 typedef struct                     // 图的定义
    10 {
    11     int edges[MAXV][MAXV];         // 邻接矩阵
    12     int n, e;                      // 分别为顶点数和边数
    13     VertexType vexs[MAXV];         // 存放顶点信息
    14 }MGraph;                           // 声明图的邻接矩阵类型

    2.2 邻接表

      邻接表是图的一种链式存储结构,它用n个单链表替代邻接矩阵的n行,即对图中的每个顶点i建立一个单链表,把与顶点i邻接的顶点放在一个链表中。邻接表中的每个单链表的头节点存放有关顶点信息,称为表头节点,其余节点存放有关边的信息,称为边表节点。

      例如,如图9.2所示,有向图9.2(a)对应的邻接表为图9.2(b)。

      邻接表的表头节点数为图中的顶点数。对于无向图的邻接表,边表节点数是图中边数的两倍;对于有向图的邻接表,边表节点数等于图中边数。

       

      图的邻接表存储结构的类型声明如下:

     1 #define    MAXV    <最大顶点个数>
     2 typedef char ElemType;            
     3 typedef int InfoType;            
     4 typedef struct ANode            
     5 {
     6     int adjvex;                     // 该边的终点位置
     7     struct ANode * nextarc;         // 指向下一条边的指针
     8     InfoType info;                  // 该边的相关信息,对于带权图可存放权值
     9 }ArcNode;                           // 边的节点结构类型
    10 
    11 typedef struct Vnode            
    12 {
    13     ElemType data;                  // 顶点信息
    14     ArcNode *firstarc;              // 指向第一条边
    15 }VNode;                             // 邻接表头节点的类型
    16 
    17 typedef VNode AdjList[MAXV]         // AdjList是邻接表类型
    18 typedef struct
    19 {
    20     AdjList adjlist;                // 邻接表
    21     int n, e;                       // 分别为图中的顶点数和边数
    22 }AGraph;                            // 声明图的邻接表类型
  • 相关阅读:
    如何在Altium中下载并添加软件没有的苦文件【转】
    20121124
    变量作用域&函数作用域
    http相关知识
    函数声明和函数表达式
    js中constructor和prototype
    委托模式
    js跨域
    原型和原型链
    javascript 数据类型
  • 原文地址:https://www.cnblogs.com/xiehongfeng100/p/4446981.html
Copyright © 2020-2023  润新知