图的定义

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

图的定义与线性表定义的对比:

  • 线性表中我们把数据元素叫元素,树中将数据元素叫结点,在图中数据元素,我们则称之为顶点(\(Vertex\))。
  • 线性表中可以没有数据元素,称为空表。树中可以没有结点,叫做空树。但是在图结构中,不允许没有顶点。在定义中,若\(V\)是顶点的集合,则强调了顶点集合\(V\)有穷非空。
  • 线性表中,相邻的数据元素之间具有线性关系,树结构中,相邻两层的结点具有层次关系,而图中,任意两个顶点之间都可能有关系,顶点之间的逻辑关系用边来表示,边集可以是空的

无向图与有向图的定义

  • 无向边: 若顶点\(v_i\)到\(v_j\)之间的边没有方向,则称这条边为无向边(\(edge\)),用无序偶对\((v_i,v_j)\)来表示。
  • 无向图: 如果图中任意两个顶点之间的边都是无向边,则称该图为无向图。
  • 有向边: 若从顶点 \(v_i\)到 \(v_j\)的边有方向,则称这条边为有向边,也称为弧\((arc)\)。用有序偶来表示,\(v_i\)称为弧尾,\(v_j\)称为弧头。
  • 有向图: 如果图中任意两个顶点之间的边都是有向边,则称该图为有向图。

无向边用小括号“()”表示,而有向边则是用尖括号“<>”表示。

图的基本概念

  • 简单图: 在图中,若不存在顶点到其自身的边,且同一条边不重复出现,则称这样的图为简单图。
  • 无向完全图: 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图,含有\(n\)个顶点的有向完全图有\(\frac{n×(n-1)}{2}\)条边。
  • 有向完全图: 在有向图中,如果任意两个顶点之间都存在方向互为相反的两条弧,则称该图为有向完全图。含有\(n\)个顶点的有向完全图有\({n×(n-1)}\)条边
  • 稀疏图与稠密图: 有很少条边或弧的图称为稀疏图,反之称为稠密图。这里稀疏和稠密是模糊的概念,都是相对而言的。
  • 权: 有些图的边或弧具有与它相关的数字,这种与图的边或弧相关的数叫做权\((weight)\)。这些权可以表示从一个顶点到另一个顶点的距离或耗费。
  • 网: 带权的图通常称为网。
  • 子图: 设有两个图\(G=(V,E)\)和\(G'=(V',{E'})\),如果\(V'∈V且E'∈E,则称G'为G的子图\)。但是并非\(V\)和\(E\)的任何子集都构成\(G\)的子图,因为这样的子集可能不是图,也就是说,\(E\)的子集中的某些边的顶点可能不在这个\(V\)的子集中。
  • 邻接点: 对于无向图\(G=(V,E)\),如果边\((v,v')∈E\),则称顶点\(v和v'\)互为邻接点,即\(v和v'\)相邻接。
  • 度: 顶点\(v\)的度是和\(v\)相关联的边的数目
  • 路径: 无向图\(G=(V,E)\)中从顶点\(v\)到顶点\(v'\)的路径是一个顶点序列
  • 路径的长度:是路径上的边或弧(有向边)的数目。
  • 简单路径: 序列中顶点不重复出现的路径称为简单路径。
  • 回路: 第一个顶点和最后一个顶点相同的路径称为回路或环。
  • 简单回路: 除了第一个顶点和最后一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。

连通图的相关概念

  • 连通: 在无向图\(G\)中,如果从顶点\(v\)到顶点\(v'\)有路径,则称\(v和v'\)是连通的。
  • 连通图: 如果对于图中任意两个顶点\(v_i、v_j∈V\),\(v_i和v_j\)都是连通的,则称\(G\)是连通图。
  • 连通分量: 无向图中的极大(强调子图图中包含的顶点个数极大)连通子图称为连通分量。连通分量的概念强调:
    • 必须是子图;
    • 子图必须是连通的;
    • 连通子图含有极大顶点数;
    • 具有极大顶点数的连通子图包含依附于这些顶点的所有边。
    • 连通图只有一个连通分量,即其自身,非连通的无向图有多个连通分量。
  • 强连通图: 在有向图G中,如果对于每一对\(v_i、v_j∈V、v_i≠v_j,从v_i到v_j和从v_j到v_i\)都存在路径,则称\(G\)是强连通图。
  • 强连通分量: 有向图中的极大强连通子图称做有向图的强连通分量。 屏幕快照 2016-08-04 上午10.22.19.png 上图中左边的并不是强连通图,因为顶点 \(A到顶点D\) 存在路径,而 \(D到A\) 就不存在。右边就是强连通图,而且显然图 \(2是图1\) 的极大强连通子图,即是它的强连通分量。
  • 一个无向图是连通的,那么边的数目大于等于顶点的数目减\(1\): \(|E| \ge (|V|-1) \)
  • 一个有向图它是强连通图的必要条件是边的数目大于等于顶点的数目: \(|E| \ge |V| \)
  • 没有回路的无向图是连通的当且仅当它是树,等价于\(|E| = (|V|-1) \)
  • 连通图的生成树:所谓的一个连通图的生成树是一个极小的连通子图,它含有图中全部的\(n\)个顶点,但只有足以构成一棵树的\(n-1\)条边。
    屏幕快照 2016-08-04 上午10.25.31.png
    图 \(1\) 是一普通图,但显然它不是生成树,当去掉两条构成环的边后,比如图\(2或图3\),就满足\(n个顶点n-1条边\)且连通的定义了,它们都是一棵生成树。

  • 有向树: 如果一个有向图恰有一个顶点的入度为\(0\),其余顶点的入度均为\(1\),则是一个有向树。所谓入度为0其实就相当于树中的根结点,其余顶点入度为\(1\)就是说树的非根结点的双亲只有一个。

图的存储结构

图的存储结构分为两种,一种是邻接矩阵一种是邻接表

  • 邻接矩阵:图的邻接矩阵存储方式是用两个数组来表示图。一个一维的数组存储图中顶点信息,一个二维数组(称为邻接矩阵)存储图中的边或弧的信息。
    • 无向图 屏幕快照 2016-08-04 上午10.42.42.jpg
    • 有向图 屏幕快照 2016-08-04 上午10.44.52.png 图的邻接矩阵表示是唯一的,且无向图的邻接矩阵是一个对称矩阵。
    • 有向网: 屏幕快照 2016-08-04 上午10.47.05.jpg 邻接矩阵是不错的一种图存储结构,但是,对于边数相对顶点较少的图,这种结构存在对存储空间的极大浪费。 屏幕快照 2016-08-10 下午7.51.45.png
  • 邻接表表示法:
    • 图中顶点用一个一维数组存储,顶点也可以用单链表来存储,不过,数组可以较容易的读取顶点的信息,更加方便。
    • 图中每个顶点 \(v_i\) 的所有邻接点构成一个线性表,由于邻接点的个数不定,所以,用单链表存储,无向图称为顶点\(v_i\)的边表,有向图则称为顶点\(v_i\)作为弧尾的出边表。
    • 无向图的邻接表: 屏幕快照 2016-08-04 上午11.10.30.png
    • 有向图的邻接表: 屏幕快照 2016-08-04 上午11.11.22.png
    • 对于带权值的网图,可以在边表结点定义中再增加一个\(weight\)的数据域,存储权值信息即可。 屏幕快照 2016-08-04 上午11.09.58.png屏幕快照 2016-08-10 下午7.53.47.png
    • 图的邻接表的表示法不唯一,因为每个顶点对应的单链表中,各边节点的链接次序可以任意。
    • 对于有\(n\)个顶点和\(e\)条边的无向图,其邻接表有\(n\)个头节点和\(2e\)个边节点

常见问题

  • 对于有\(n\)个顶点的无向图和有向图,采用邻接矩阵和邻接表表示时,如何判定以下问题

    • 图中有多少条边?
      • 对于邻接矩阵表示的无向图,边数等于图中矩阵1的个数除以2,对于邻接表表示的无向图边数等于边节点的个数除以2
      • 对于邻接矩阵表示的有向图,边数等于图中矩阵1的个数,对于邻接表表示的有向图边数等于边节点的个数
    • 任意两个顶点\(i\)和\(j\)是否有边相连?
      • 对于邻接矩阵表示的无向图和有向图,任意两个节点\(i和j\),邻接矩阵的\(arc[i][j]\)的值为1,则表示有边相连,否则无边相连
      • 对于邻接表表示的无向图和有向图,从顶点表头节点\(adjList[i]\)出发找到顶点编号为\(j\)的边节点,则表示有边相连,否则无边相连
    • 任意一个顶点的度为多少?
  • 设计一个算法将不带权值的邻接矩阵表示转换为邻接表表示
    屏幕快照 2016-08-11 下午2.22.07.png

  • 设计一个算法将不带权值的邻接表表示转换为邻接矩阵表示
    屏幕快照 2016-08-10 下午8.49.03.png

  • 假设不带权值的图\(G\)采用邻接表存储,采用\(BFS\)方式设计一个算法输出从图\(G\)中顶点\(u\)到\(v\)的最短路径。
    屏幕快照 2016-08-11 下午7.32.31.png
    屏幕快照 2016-08-11 下午7.33.05.png

posted @ 2017-04-18 09:29  I呆呆  阅读(592)  评论(0)    收藏  举报