一、图的基本概念
图(Graph)是一种较树更为复杂的非线性数据结构。在树形结构中,数据元素之间的关系是层次型的,树中除叶子以外的每一个数据元素可以和它下一层的多个数据元素存在关系;但除根元素以外的每一个数据元素只能且必须和它上一层中的一个数据元素存在关系。而在图形结构中,数据元素之间的关系是任意的,图中每一个数据元素可以和任何其它数据元素相关联。
分类:图分为有向图和无向图
组成:图G由顶点集V(顶点)和关系集E(边)组成,记为(V,E);
V是顶点(元素)的有穷非空集,记为V(G)
E是V中两个顶点对(称为边)的有穷集合,,记为E(G)
注:E(G)是空集,图G只有顶点,没有边;
1.1有向图:
G=(V,{A})其中,V为顶点的有穷集合,{A}为顶点之间的关系集合
G1=(V,{A})
V={V1,V2,V3,V4}
A={<V1,V2>,<V1,V3>,<V3,V4>,<V4,V1>}
其中<x,y>表示从x到y的一条弧,A为弧集合,x为弧尾,y为弧头(箭头指着的元素)

1.2无向图:
G=(V,{E}),其中V同有向图,{E}为顶点之间的关系集合,E为边集合
G2=(V,{E})
V={V1,V2,V3,V4,V5}
A={(V1,V2),(V1,V4),(V2,V3),(V3,V4),(V2,V5),(V3,V5)}
其中(x,y)表示从x与y之间的一条直线,称为边

1.3有关概念
(1)图的顶点数为n,边数为e
n与e的关系:①有向图:
②有向图:
(2)完全图:边达到最大的图
①无向完全图:边数为的无向图
②有向完全图:边数为的有向图
(3)权:与图的边或相关的述;
网:边或弧上带有权值的图
(4)顶点的度TD(V)
①无向图的度数:为依附于顶点V的边数
②有向图的度数:等于以顶点V为弧头的弧数(称为V的入度,记为ID(V))与以顶点V为弧尾的弧数(称为弧的出度,记为OD(V))之和
即:TD(V)=ID(V)+OD(V)
(5)路径长度:路径上边或弧的数目
回路或环:首尾顶点相同的路径
简单路径:路径中不含相同顶点的路径
简单回路:除首尾顶点外,路径中不含相同顶点的回路
(6)联通
顶点联通:若顶点V到顶点由路径,则称顶点V与顶点
是联通的


(7)生成树:定义:设无向图G是含有n个顶点的连通图,则图G的生成树是含有n个顶点,且只有
n-1条边的连通子图,
三要素:①n个顶点 ②n-1条边 ③连通
(8)子图:图的一部分,它本身也是一个图
图G=(V,E)和G’=(V’,E’)且V’是V的子集,E是E’的子集,则称G’是G的子图
二、图的存储结构
2.1图的顺序存储结构———邻接矩阵
*数组表示法
设图G=(V,{E})有n个顶点,则G的邻接矩阵定义为n阶方阵
其中,a[i,j]=

邻接矩阵的特点:
判定两个顶点Vi与Vj是否关联,只需判断A[i,j]是否为1;
求顶点的度容易:
①无向图的度:TD(Vi)=,
即顶点Vi得度等于邻接矩阵中第i行(或第j列)的元素和(非零元素个数)
②有向图的个数:TD(Vi)=
若G是带权图,Wij是边(Vi,Vj)或<Vi,Vj>的权,其邻接矩阵定义为:

2.2图的链式存储————邻接表
(1)无向图的邻接表
对图中每个顶点Vi建立一个单链表,链表中的结点表示依附于顶点Vi的边,每个链表结点为两个域:
其中:邻接点于记载与顶点Vi邻接的顶点信息;
链域指向下一个与顶点Vi邻接的链表结点
每个链表附设一个头结点,头结点结构为:
其中:存放顶点信息
指向链表的第一个结点


无向图邻接表特点:
Ⅰ、n个顶点,e条边的无向图,需要n个头结点和2e个链表结点
Ⅱ、顶点Vi的度TD(Vi)=链表i中链表结点数
(2)有向图的邻接表
在第i条链表上的结点是以Vi为弧尾的各个弧头顶点


有向图邻接表特点:
Ⅰ、n个顶点,e条弧的有向图,需要n个表头结点,e个链表结点
Ⅱ、第i条链表上的链表结点数为Vi的出度(求顶点的出度容易,求顶点的出度难)
(3)有向图的逆邻接表
与有向图的邻接表结构一样,只是在第i条链表上的结构是以Vi为弧头的各个弧尾顶点


此时,第i条链表上的结点数为Vi的入度
2.3图的邻接矩阵与邻接表表示的比较
①图的邻接矩阵表示是唯一的,邻接表表示不唯一
②邻接表(逆邻接表)中,每个边表对应邻接矩阵中的一行(或一列),边表中结点的个数等于邻接矩阵中一行(或一列)非零元素的个数
③若边数e小于称为稀疏图;e接近
称为稠密图,考虑链域占空间,应选择邻接矩阵存储为宜
求有向顶点的度,采用邻接矩阵
三、图的遍历
遍历图:从图中某个顶点出发,沿路径使每个顶点被访问且仅被访问一次的过程

1.1深度优先搜索(DFS):一深到底
遍历图的过程:
①访问指定的某结点V,将V作为当前结点
②访问当前结点的下一未被访问过的邻接点,并将该结点作为当前顶点
③重复②,直到当前结点的所有邻接点都被访问过
④沿搜索路径回退,退到尚有邻接点未被访问过的某结点,将该结点作为当前结点,重复②,直到所有结点被访问过为止

1.2广度优先搜索(BFS)(树的层次遍历过程类似)
①首先访问指定顶点V1,将V1作为当前结点;
②访问当前结点的所有未被访问过的邻接点,并依次将访问的这些邻接点作为当前顶点
③重复②,直到所有顶点被访问为止
