图的概述

  本文关于图的概述主要引自《新编数据结构习题与解析》(李春葆等著)第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;                            // 声明图的邻接表类型

 

posted @ 2015-04-22 11:41  峰子_仰望阳光  阅读(843)  评论(0编辑  收藏  举报