一,基础概念
1.图的简介
图没有起始位置和终止位置,是由顶点和边组成的一种非线性数据结构。
2.图结构的常见概念
(先大概了解一下,后面可以结合图示对照看看):
顶点(Vertex/Node):顶点又称节点,是图的基础部分。
边(Edge):两个顶点之间的连线。
权重(Weight):边上可以附带的权重大小,用来表示从一个顶点到另一个顶点的成本。
相邻(Adjacency):同一条边两端的顶点被称为相邻或者邻接。
路径(Path):由边连接的顶点组成的序列。
度(Degree):连接到一个顶点的边的数量。
入度(Indegree):按传入方向连接到顶点的有向边的总数。
出度(Outdegree):按传出方向连接到顶点的有向边的总数。
3.图的等式表示
图结构可以用等式表示:G=(V, E)。
G是图结构的抽象表示。
V是图中的顶点集合,一般用数组存储,所以V常见于顶点数组。
E是相邻顶点的集合,E中的元素也表示他们连接而成的边。例如E中的一个元素是(u, v),表示顶点u和顶点v连接成的边。如果是有方向的边,(u, v)和(v, u)表示的是不同方向的两条边,如果是无方向的边,则(u, v)和(v, u)表示的是同一条边。例如下图中的(1, 2)和(2, 1)表示的是相同的边。
该图有一组顶点V={1,2,3,4,5}和一组边E={(1,2),(1,3),(2,3),(2,4),(2,5),(3,5),(4,5)}。
二,常见的图结构分类
a.无向图
任意两个顶点之间的边不带方向。
b.有向图
任意两个顶点之间的边区分方向。
c.连通图
图数据结构的一个顶点与任何其他顶点之间存在可以到达的路径、
d.子图
顶点和边的组合是另一个图的子集
e.加权图
每条边都有一个权重,表示遍历该边的成本
三,图的常见表示方式
基于二维数组的表示方式——邻接矩阵(Adjacency Matrix)
基于链表的表示方式——邻接表(Adjacency List)
1.邻接矩阵
邻接矩阵用于显示哪些节点彼此相邻。
矩阵的行和列都是图的顶点列表,矩阵中不为0的地方表示顶点之间互相连接,即矩阵中不为0的地方表示边。
a.无向图的邻接矩阵
如果顶点a和顶点b之间存在边:AdjMatrix(A, B)=AdjMatrix(B, A)=1
b.有向图的邻接矩阵
如果存在顶点b到顶点a的边:AdjMatrix(B, A)=1
如果不存在顶点a到顶点b的边:AdjMatrix(A, B)=0
c.加权无向图的邻接矩阵
如果顶点a和顶点b之间存在边,且边的权重为3:AdjMatrix(A, B)=AdjMatrix(B, A)=3
2.邻接表
通俗说就是每个顶点专门有一个列表来记录自己有哪些邻居,这个列表常用链表结构来实现。此结构维护了两张表:
1.包含所有顶点的数组(主表)。
2.每个顶点单独对应的链表,此链表包含了与此顶点相邻的所有顶点集合。