一. 思维导图

数据结构——图_数据结构

二. 图的基本概念

1. 图的定义

图G由两个集合V和E组成,记为G=(V,E),其中V是顶点的有限集合,记为V(G),E是连接V中两个不同顶点(顶点对)的边的有限集合,记为E(G)。

2. 有向图、无向图

有向图:在图G中,如果表示边的顶点对(或序偶)是有序的,则称G为有向图。
无向图:在图G中,若

3. 图的基本术语

(1) 端点和邻接点

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

(2) 顶点的度、入度和出度

在无向图中,一个顶点所关联的边的数目称为该顶点的度。在有向图中,顶点的度又分入度和出度,以顶点j为终点的边的数目,称为该顶点的入度。以顶点i为起点的边的数目,称为该顶点的出度。一个顶点的入度与出度的和为该顶点的度。

(3) 完全图

若无向图中的每两个顶点之间都存在着一条边,有向图中的每两个顶点之间都存在着方向相反的两条边,则称此图为完全图。

(4) 稠密图和稀疏图

当一个图接近完全图时,称为稠密图。相反,当一个图含有较少的边数时,则称为稀疏图。

(5) 子图

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

(6) 路径和路径长度

在一个图G=(V,E)中,从顶点i到顶点j的一条路径是一个顶点序列(i,i1,i2,……,im,j)。路径长度是指一条路径上经过的边的数目。

(7) 回路或环

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

(8) 连通、连通图和连通分量

在无向图G中,若从顶点i到顶点j有路径,则称顶点i到顶点j是连通的。若图G中的任意两个顶点都是连通的,则称G为连通图,否则称为非连通图。无向图G中的极大连通子图称为G的连通分量。
数据结构——图_数据结构_02

(9) 强连通图和强连通分量

在有向图G中,若从顶点i到顶点j有路径,则称从顶点i到顶点j是连通的。若图G中的任意两个顶点i和j都连通,即从顶点i到顶点j和从顶点j到顶点i都存在路径,则称图G是强连通图。有向图G中的极大强连通子图称为G的强连通分量。
数据结构——图_数据结构_03

(10) 权和图

图中的每一条边都可以附有一个对应的数值,这种与边相关的数值称为权。边上带有权的图称为带权图,也称作网。

三. 图的存储结构和基本运算算法

1. 邻接矩阵存储方法

图的邻接矩阵是一种采用邻接矩阵数组表示顶点之间相邻关系的存储结构。
顶点信息:记录各个顶点信息的顶点表。
边和狐信息:各个顶点之间关系的邻接矩阵。
数据结构——图_数据结构_04

无向图的邻接矩阵是对称的,有向图的邻接矩阵可能是不对称的。
数据结构——图_数据结构_05

数据结构——图_数据结构_06

数据结构——图_数据结构_07

2. 邻接表存储方法

图的邻接表是一种顺序与链式存储相结合的存储方法。
只存储图中已有的弧或边的信息:
对图中的每个顶点都建立一个单链表来存储所有依附于该顶点的弧或边
无向图:第i个单链表中的结点表示依附于顶点v的边。
有向图:第i个单链表中的结点表示以顶点v为尾的弧。
对图中所有顶点使用一个一维数组来存放
单链表中每个结点由三个域组成
邻接点域(adjvex):指示与顶点v邻接的点在图中的位置;
链域(nextarc):指示下一条边或弧的结点;
数据域(info):存储和边或弧相关的信息,如权值等。

数据结构——图_数据结构_08

3. 其他存储方法

(1) 十字链表

将有向图的邻接表和逆邻接表结合起来的一种链表。
数据结构——图_数据结构_09

从横向上看是邻接表,从纵向上看是逆邻接表。
数据结构——图_数据结构_10

数据结构——图_数据结构_11

(2) 邻接多重表

邻接多重表是无向图的另外一种存储结构,与十字链表类似。

四. 图的遍历

1. 图的遍历的概念

从图中某个顶点出发游历图,访遍图中其余顶点,并且使图中的每个顶点仅被访问一次的过程。

2. 深度优先遍历

(1)连通图的深度优先搜索遍历

从图中某个顶点Vo出发,访问此顶点,然后依次从Vo的各个未被访问的邻接点出发深度优先搜索遍历图,直至图中所有和V有路径相通的顶点都被访问到。
数据结构——图_数据结构_12

数据结构——图_数据结构_13

数据结构——图_数据结构_14

(2)非连通图的深度优先搜索遍历

首先将图中每个顶点的访问标志设为FALSE,之后搜索图中每个顶点,如果未被访问,则以该顶点为起始点,进行深度优先搜索遍历,否则继续检查下一顶点。
数据结构——图_数据结构_15

深度优先遍历的实质:对个顶点查找其邻接点的过程。

3. 广度优先遍历

从图中的某个顶点Vo出发,并在访问此顶点之后依次访问Vo的所有未被访问过的邻接点,之后按这些顶点被访问的先后次序依次访问它们的邻接点,直至图中所有和Vo有路径相通的顶点都被访问到。
数据结构——图_数据结构_16

广度优先遍历的实质:通过边或弧找邻接点的过程。

五 .生成树和最小生成树

1. 生成树的概念

一个连通图的生成树是一个极小连通子图,其中含有图中的全部顶点,和构成一棵树的(n-1)条边。如果在一生成树上添加
任何一条边,必定构成一个环,因为添加的这条边使得它关联的那两个顶点之间有了第2条路径。
一棵有n个顶点的生成树(连通无回路图)有且仅有(n-1)条边。如果一个图有n个顶点和小于(n-1)条边,则是非连通图。如果它多于(n-1)条边,则一定有回路。
对于一个带权(假设每条边上的权均为大于零的实数)连通无向图G中的不同生成树,其每棵树的所有边上的权值之和也可能不同;图的所有生成树中具有边上的权值之和最小的树称为图的最小生成树。
按照生成树的定义,n个顶点的连通图的生成树有n个顶点、(n-1)条边。因此,构造最小生成树的准则有以下3条:
(1)必须只使用该图中的边来构造最小生成树;
(2)必须使用且仅使用(n-1)条边来连接图中的n个顶点;
(3)不能使用产生回路的边。

2. 无向图的连通分量和生成树

数据结构——图_数据结构_17

数据结构——图_数据结构_18

数据结构——图_数据结构_19

数据结构——图_数据结构_20

数据结构——图_数据结构_21

3. 普里姆算法

基本思想:
第一步:取图中任意一个顶点v作为生成树的根;
第二步:往生成树上添加新的顶点w。在添加的顶点w和已经在生成树上的顶点v之间必定存在一条边,并且该边的权值在所有连通顶点v和w之间的边中取值最小;
第三步:继续往生成树上添加顶点,直至生成树上含有n个顶点为止。
数据结构——图_数据结构_22

数据结构——图_数据结构_23

数据结构——图_数据结构_24

4. 克鲁斯卡尔算法

基本思想:
第一步:构造一个只含n个顶点的子图SG;
第二步:从权值最小的边开始,若它的添加不使SG中产生回路,则在SG上加上这条边;
第三步:如此重复,直至加上n-1条边为止。

六. 最短路径

1. 路径的概念

在一个不带权图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减1。由于从一顶点到另一顶点可能存在着多条路径,每条路径上所经过的边数可能不同,即路径长度不同,把路径长度最短(即经过的边数最少)的那条路径称为最短路径(shortest path),其长度称为最短路径长度或最短距离。
对于带权图,考虑路径上各边上的权,则把一条路径上所经边的权之和定为该路径的路径长度。从源点到终点可能有不止一条路径,把路径长度最小的那条路径称为最短路径,其路径长度(权之和)称为最短路径长度。
实际上,只要把不带权图上的每条边看成是权值为1的边,那么不带权图和带权图的最短路径和最短距离的定义就一致了。
求图的最短路径有两个方面的问题,即求图中某一顶点到其余各顶点的最短路径和求图中每一对顶点之间的最短路径。

2. 从一个顶点到其余各顶点的最短路径

数据结构——图_数据结构_25

数据结构——图_数据结构_26

数据结构——图_数据结构_27

3. 每对顶点之间的最短路径

数据结构——图_数据结构_28

数据结构——图_数据结构_29

七. 拓扑排序

有向无环图
数据结构——图_数据结构_30

拓扑排序
对有向图进行如下操作:
按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系。
由此所得顶点的线性序列称之为拓扑有序序列。

如何进行拓扑排序?
从有向图中选取一个没有前驱的顶点,并输出之;
从有向图中删去此顶点以及所有以它为尾的弧;
重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

八. AOE网与关键路径

AOE网:边表示活动的网。
顶点表示事件、弧表示活动、权表示活动持续的时间。
用AOE-网可估算工程的完成时间。对AOE网,常考虑如下两个问题:
1.完成整个工程至少需要多少时间?
2.哪些活动是影响工程进度的关键?

几个概念
事件vi的最早发生时间:从开始点v1到vi的最长路径长度。用ve(i)表示。
事件vi的最迟发生时间:在不推迟整个工期的前提下,事件vi允许的最晚发生时间。用vl(i)表示。

关键路径
数据结构——图_数据结构_31

疑难问题
  1. 如何实现深度优先遍历与广度优先遍历
  2. 如何找到两个顶点之间的最短路径