图 —— 非线性数据结构
概念:
图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。
无向图: 由没有方向的边构成的图
无向图中的边由顶点的无序对组成(用圆括号表示) (v2,v1) (v1,v2)表示同一条边。
邻接点: 无向图中,若存在一条边(vi,vj),则称vi和vj互为邻接点。
有向图: 由有方向的边构成的图
弧:有向图中的边由顶点的有序对组成,也称作狐。(用尖括号表示)<v1,v2> ,<v2,v1>表示不是同一条边。
图的类型:
完全图:图中任意两项点检均有边相连。
无向完全图:有n个顶点和n(n-1)/2条边的无向图。
有向完全图:有n个顶点和n(n-1)/2条弧的有向图。
子图:对于图G=(V,E)和 图G’ = (V’,E‘),若存在 G’∈ G 且 E’∈E,则称图G’是图G的子图。
顶点的度:
无向图中,顶点的度是与每个顶点相连的边数。
有向图中,顶点的度分成为入度和出度。
—— 入度:以该顶点为终点的弧的数目(箭头指向的方向)。
—— 出度:以该顶点为起点的弧的数目。
顶点V的度等于顶点V的入度和出度。
路径:从Vi出发,经过一系列的边或弧能够到达Vj,则称Vi到Vj所经过的顶点序列为Vi到Vj的路径。
路径长度:路径经过的边数的数目或者各边权值之和。
回路:第一个顶点和最后一个顶点相同的路径。
简单路径: 序列中不出现重复的路径。
简单回路:除了第一个顶点和最后一个顶点外,其余顶点不重复出现。
连通:顶点Vi到Vj有一条路径则Vi和Vj是连通的。
连通图:图中任意的两个顶点都是连通的。
连通分量:非连通图的每个极大连通子图
强连通分量:有向图中任意不同的顶点Vi和Vj,从Vi到Vj和从Vj到Vi都存在路径。
图的存储结构与实现:
-邻接矩阵
- 邻接表
邻接矩阵:
表示顶点间相联关系的矩阵:设G = (V,E)是有n ≥ 1 个顶点的图,G的邻接矩阵A是具有以下性质的n阶方阵。
特点:
-无向图的邻接矩阵对称
-有向图邻接矩阵不一定对成
-无向图中vi的度是邻接矩阵中第i行的元素之和
有向图中:
-顶点vi的出度是A中第i行元素之和。
-顶点vi的入度是A中第i列元素之和。
权:图中边或弧上附带的数据成为权
网:带权的图称为网。
邻接表
邻接表由顶点表和边表组成,是链式存储结构。
顶点表:存放图中每个顶点的信息以及指向该顶点边表的头指针。顶点表通常采用顺序存储结构。
顶点表的节点结构:
顶点域data存放顶点信息,head为表头指针。
边表:为图中每个顶点建立的单链表,单链表中存放与一个顶点相邻接点,相当于邻接矩阵中的一行。
邻接点域adjvex存放邻接点在顶点表中的序号 ,next为指向下一个邻接点的指针。
特点
有向图中:
—— 顶点Vi中的出度就是第i个单链表中节点的个数
—— 顶点 Vi中的入度就是邻接链表中所有邻接点值域为i的节点个数
无向图中:
—— 无向图中顶点V的度就是第i个单链表中的节点数
**
逆邻接表
结构与邻接表完全相同,只是边表中每个节点存放的是每条弧的弧尾节点。