数据结构 - 图 I (Graph I)
本文将介绍图的基础知识,并用C++实现它。
它包含两部分:
-
编程基础 - 图 I (Graph I) :存储结构(本文)
-
编程基础 - 图 II (Graph II) :实现完整的邻接矩阵并遍历
在查看本文之前,需要一些数据结构和程序语言的基础。
尤其是“二维数组”、“矩阵”、“矩阵的压缩(matrix)”。一些遍历和应用的内容还需要“栈(stack)”,“队列(queue)”,“二叉树(binary tree)”等的知识。
文章目录
1 图的简述 (Introduction)
图的概念很多,我们只说一些重要的,其它可以去查资料。
-
图:
- 图是由顶点集合(vertex)以及顶点间的关系集合(edge)组成的一种数据结构;
- 图是顶点的 有穷非空 集合;
- 有向图顶点有序,无向图顶点无序;
-
完全图:
- 完全无向图: n n n 个顶点的无向图有 n × ( n − 1 ) ÷ 2 n \times (n-1) \div 2 n×(n−1)÷2 条边;
- 完全有向图: n n n 个顶点的有向图有 n × ( n − 1 ) n \times (n-1) n×(n−1) 条边;
-
邻接顶点:同一条边的两个顶点,互相称为邻接顶点;
-
权( weight 或 cost ):具有数值标识的边;
-
网络:带有权的图;
-
顶点的度:该顶点 v v v 的入度和出度之和;
- 入度:以顶点为终点的边数,记作 I D ( v ) ID(v) ID(v) ;
- 出度:以顶点为出发点的边数,记作 O D ( v ) OD(v) OD(v) ;
-
路径:从一点到另一点所经过的顶点序列;
- 路径长度:通过的边数;
- 简单路径:经过的顶点互不重复;
- 回路(环):出发点与终点重合;
-
连通:两个顶点间存在路径,则称这两个顶点连通。
- 连通图:
- 无向图中,任意两个顶点都是连通的;
- 有向图中,路径中任意两个顶点的边必须同向;
- 强连通图:有向图中,任意两个顶点都存在互通的路径,即双向路径。
- 生成树:连通图的极小连通子图,如果有 n n n 个顶点,则有 n − 1 n-1 n−1 条边
- 连通图:
2 图的存储结构 (Storage Structure)
图的基本存储方式有:
- 邻接矩阵 (Adjacency Matrix)
- 邻接表 (Adjacency List)
- 十字链表 (Orthogonal List)
- 邻接多重表 (Adjacency Multilist)
2.1 邻接矩阵 (Adjacency Matrix)
在图的邻接矩阵表示中:
- 顶点列表:记录各个顶点的数据信息;
- 邻接矩阵:表示各个顶点之间的关系(边或权);
其中无向图的邻接矩阵是对称方阵,有向图的邻接矩阵不一定对称。
Tips
无向图的存储可以进行压缩。
特殊矩阵的压缩存储 (Compressed Storage of Special Matrix)
-
无向图的邻接矩阵,一般只存储与其它结点是否连接,0表示没有连接,1表示右连接。
例如:其矩阵为:
A B C D E F A 0 1 0 0 1 0 B 1 0 0 1 1 1 C 0 0 0 1 0 1 D 0 1 1 0 0 0 E 1 1 0 0 0 0 F 0 1 1 0 0 0 \begin{matrix} &A &B &C &D &E &F \\[2ex] A &0 &1 &0 &0 &1 &0 \\[2ex] B &1 &0 &0 &1 &1 &1 \\[2ex] C &0 &0 &0 &1 &0 &1 \\[2ex] D &0 &1 &1 &0 &0 &0 \\[2ex] E &1 &1 &0 &0 &0 &0 \\[2ex] F &0 &1 &1 &0 &0 &0 \end{matrix} ABCDEFA010010B100111C000101D011000E110000F011000
-
有向图的邻接矩阵,分有没有权值:
- 没有权值依然存储0或者1;
- 有权值的话存储的是权值,其矩阵也叫网络邻接矩阵,如果无连接用无穷符号( ∞ \infin ∞ )表示。