图的邻接矩阵表示方法
在图的存储结构中,邻接矩阵是一种常用的数据表示方式。它通过一个二维数组来描述顶点之间的连接关系,适用于有向图和无向图的建模。设图G = (V, E),其中V为顶点集合,E为边集合,若|V| = n,则邻接矩阵是一个n×n的方阵。
对于无向图,邻接矩阵具有对称性:若顶点i与顶点j之间存在边,则matrix[i][j] = matrix[j][i]。同时,主对角线元素通常为0(不包含自环),因此只需存储上三角或下三角部分即可节省空间,实际所需空间为n(n-1)/2。
在有向图中,邻接矩阵不一定对称。第i行非零元素的个数代表顶点i的出度,第i列非零元素的个数则表示入度。顶点i的总度数为其出度与入度之和。
使用邻接矩阵可快速判断任意两个顶点间是否存在边,时间复杂度为O(1)。然而其空间开销较大,为O(n²),尤其当图稀疏时会造成内存浪费。
以下为典型的邻接矩阵结构定义:
#define MaxVertexNum 100
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MaxVertexNum]; // 顶点数组
EdgeType edges[MaxVertexNum][MaxVertexNum]; // 邻接矩阵
int n, e; // 当前顶点数与边数
} MGraph;
创建无向图的邻接矩阵示例代码如下:
void CreateMGraph(MGraph *G) {
int i, j, k, w;
scanf("%d%d", &G->n, &G->e);
for (i = 0; i < G->n; i++) {
G->vexs[i] = getchar(); // 输入顶点信息
}
for (i = 0; i < G->n; i++) {
for (j = 0; j < G->n; j++) {
G->edges[i][j] = 0; // 初始化邻接矩阵
}
}
for (k = 0; k < G->e; k++) {
scanf("%d%d%d", &i, &j, &w);
G->edges[i][j] = w;
G->edges[j][i] = w; // 无向图需双向赋值
}
}
若图为带权图(网络),邻接矩阵中的元素表示边的权重。若两点无直接连接,对应位置可设置为无穷大(如INT_MAX或自定义极大值)。
以MATLAB为例,构建4个节点的有向图:
N = 4;
dag = zeros(N, N);
C = 1; S = 2; R = 3; W = 4;
dag(C, [R, S]) = 1; % C→R, C→S
dag(R, W) = 1; % R→W
dag(S, W) = 1; % S→W
该矩阵即为图的邻接表示,便于后续进行路径搜索、连通性分析等操作。
邻接矩阵的优势在于实现简单、查询效率高;缺点是空间利用率低,不适合大规模稀疏图。对于特殊场景,可通过压缩存储技术优化,例如只保存上三角区域。