一.图的定义
1.定义:
(1)图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合
(2)图按照有无方向分为无向图和有向图。无向图由顶点和边构成,有向图由顶点和弧构成。弧有弧尾和弧头之分
(3)图按照边或弧的多少分稀疏图和稠密图。如果任意两个顶点之间都存在边叫完全图,有向的叫有向完全图。若无重复的边或顶点到自身的边则叫简单图
(4)图中顶点之间有邻接点、依附的概念。无向图顶点的边数叫做度,有向图顶点分为入度和出度
(5)图上的边或弧上带权则称为网
(6)图中顶点间存在路径,两顶点存在路径则说明是连通的,如果路径最终回到起始点则称为环,当中不重复叫简单路径。若任意两顶点都是连通的,则图就是连通图,有向则称强连通图。图中有子图,若子图极大连通则就是连通分量,有向的则称强连通分量
(7)无向图中连通且n个顶点n-1条边叫生成树。有向图中一顶点入度为0其余顶点入度为1的叫有向树。一个有向图由若干棵有向树构成生成森林
二.图的抽象数据类型
三.图的存储结构
1.邻接矩阵
图的邻接矩阵(Adjacency Matrix)存储方式是用两个数组来表示图
(1)设图G有n个顶点,则邻接矩阵是一个n×n的方阵,定义为:
无向图
有向图
2.邻接表
(1)定义:
图中顶点用一个一维数组存储,当然,顶点也可以用单链表来存储,不过数组可以较容易地读取顶点信息,更加方便。另外,对于顶点数组中,每个数据元素还需要存储指向第一个邻接点的指针,以便于查找该顶点的边信息。
图中每个顶点vi的所有邻接点构成一个线性表,由于邻接点的个数不定,所以用单链表存储,无向图称为顶点vi的边表,有向图则称为顶点vi作为弧尾的出边表。
无向图的邻接表结构
有向图的邻接表结构
3.十字链表
(1)十字链表的好处就是因为把邻接表和逆邻接表整合在了一起,这样既容易找到以vi为尾的弧,也容易找到以vi为头的弧,因而容易求得顶点的出度和入度
十字链表
4.邻接多重表
5.边集数组
(1)边集数组是由两个一维数组构成。
一个是存储顶点的信息;另一个是存储边的信息,这个边数组每个数据元素由一条边的起点下标(begin)、终点下标(end)和权(weight)组成
边集数组
四.图的遍历
1.深度优先遍历
(1)深度优先遍历(Depth_First_Search),也有称为深度优先搜索,简称为DFS
深度优先遍历
2.广度优先遍历
(1)广度优先遍历(Breadth_First_Search),又称为广度优先搜索,简称BFS
广度优先遍历