基本概念
指用一个一维数组存储图中顶点的信息,用一个二维数组存储图中边的信息(即各顶点之间的邻接关系),存储顶点之间邻接关系的二维数组称为邻接矩阵。其中有指向关系用1表示,没有指向关系用0表示
结点数为n的图G=(V, E)的邻接矩阵A是nxn的。将G的顶点编号为v1, v2,…, vn。
A[i][j]={1,0,若(vi,vj)或<vi,vj>是E(G)的边若(vi,vj)或<vi,vj>不是E(G)的边无向图
有向图
存储代码
1 2 3 4 5 6
| #define MaxVertexNum 100 typedef struct { char Vex[MaxVertexNum]; int Edge[MaxVertexNum][MaxVertexNum]; int vexnum, arcnum; }MGraph;
|
1.顶点中可以存更复杂的信息
2.可以用布尔型或枚举类型变量表示边
顶点的度
第i个结点的度 = 第i行(或第i列)的非零元素个数
第i个结点的出度 = 第i行的非零元素个数
第i个结点的入度 = 第i列的非零元素个数
第i个结点的度 = 第i行、第i列的非零元素个数之和
时间复杂度
邻接矩阵法求顶点的度/出度/入度的时间复杂度为O(|V|)
带权图(网)
代码结构
1 2 3 4 5 6 7 8 9
| #define MaxVertexNum 100 #define INFINITY 最大的int值 typedef char VertexType; typedef int EdgeType; typedef struct { VertexType Vex[MaxVertexNum]; EdgeType Edge[MaxVertexNum][MaxVertexNum]; int vexnum, arcnum; }MGraph;
|
无穷表示两个顶点之间不存在边(零也是相同含义)
如果G是有向带权图,则
A[i][j]={wij0或∞若Vi=Vj且<Vi,Vj>∈E(G)其他表示为
A[i][j]=⎩⎪⎪⎨⎪⎪⎧wij0∞若Vi=Vj且<Vi,Vj>∈E(G)若Vi=Vj若<Vi,Vj>∈/E(G)无向网
有向网
性能分析
①在简单应用中,可直接用二维数组作为图的邻接矩阵(顶点信息等均可省略)。
②当邻接矩阵中的元素仅表示相应的边是否存在时,EdgeType可定义为值为0和1的枚举类型。
③无向图的邻接矩阵是对称矩阵,对规模特大的邻接矩阵可采用压缩存储。
④邻接矩阵表示法的空间复杂度为O(n2),其中n为图的顶点数|V|。
重要性质
1.空间复杂度O(|V|^2)只和顶点数相关,和实际的边数无关
2.适合用于存储稠密图
3.无向图的邻接矩阵是对称矩阵,可以压缩存储(只存储上三角区/下三角区)
常用性质
①无向图的邻接矩阵一定是一个对称矩阵(并且唯一)。因此,在实际存储邻接矩阵时只需存储上(或下)三角矩阵的元素。
②对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度TD(vi)。
③对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度OD(vi)(或入度ID(vi))。
④用邻接矩阵法存储图,很容易确定图中任意两个顶点之间是否有边相连。但是,要确定图中有多少条边,则必须按行、按列对每个元素进行检测,所花费的时间代价很大。这是用邻接矩阵存储图的局限性。
⑤稠密图适合使用邻接矩阵的存储表示。
示例一
设图G的邻接矩阵为A(矩阵元素为0/1),则A^n的元素A^n[i][j]等于由顶点i到顶点j的长度为n的路径的数目
A2[1][4]=a1,1a1,4+a1,2a2,4+a1,3a3,4+a1,4a4,4=1A2[2][2]=a2,1a1,2+a2,2a2,2+a2,3a3,2+a2,4a4,2=3A2[3][3]=a3,1a1,3+a3,2a2,3+a3,3a3,3+a3,4a4,3=1A2[1][2]=a1,1a1,2+a1,2a2,2+a1,3a3,2+a1,4a4,2=0示例二
设图G的邻接矩阵为A(矩阵元素为0/1),则A^n的元素A^n[i][j]等于由顶点i到顶点j的长度为n的路径的数目