邻接矩阵用n×n二维数组存储图,无向图对称赋值,有向图单向赋值,带权图存权重或用特殊值表示无效边;java中可用int[][]实现,支持边添加、查询与矩阵打印。

邻接矩阵是图论中最基础的存储方式之一,用二维数组就能直观表示顶点之间的连接关系。Java 中用 int[][] 或 boolean[][] 实现非常直接,适合边数较多或需要频繁查询两点是否连通的场景。
邻接矩阵怎么存图?
假设有 n 个顶点(编号 0 到 n-1),就声明一个 n×n 的二维数组 graph[n][n]:
-
无向图:若顶点 i 和 j 相连,则
graph[i][j] = graph[j][i] = 1(或权重值);不连通则为 0。 -
有向图:只设
graph[i][j] = 1表示从 i 指向 j 的边,graph[j][i]不一定相同。 -
带权图:数组元素存权重,不连通时可用
Integer.MAX_VALUE或 -1 表示无穷大/无效边。
动手写一个带初始化的邻接矩阵类
下面是一个支持添加边、查询边、打印矩阵的简易实现:
// 示例:5 个顶点的无向带权图
public class GraphMatrix {
private int n; // 顶点数
private int[][] matrix; // 邻接矩阵
public GraphMatrix(int n) {
this.n = n;
this.matrix = new int[n][n];
// 初始化为 0(无边)
for (int i = 0; i = 0 && i = 0 && j
实际使用小技巧
写完类后,可以这样快速验证:
- 创建对象:
GraphMatrix g = new GraphMatrix(4);表示 4 个顶点。 - 加边:
g.addEdge(0, 1, 5); g.addEdge(1, 2, 3); g.addEdge(0, 3, 7); - 查边:
System.out.println(g.getWeight(0, 2));输出 0(未连通);g.getWeight(0, 1)输出 5。 - 注意边界检查——避免数组越界是多维数组操作中最常见的错误。
邻接矩阵 vs 邻接表?什么时候选它?
邻接矩阵不是万能的,但优势明确:
- 判断两点是否相邻:O(1),比遍历邻接表快得多。
- 适合稠密图(边数接近 n²),空间 O(n²) 可接受。
- 实现算法如 Floyd-Warshall(多源最短路径)、图的幂运算(求长度 k 的路径数)更自然。
- 缺点也很明显:稀疏图浪费大量空间;增删顶点需重建数组;遍历所有邻边要扫整行 O(n)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











