邻接矩阵

📌 定义

邻接矩阵使用二维数组表示图,其中 matrix[i][j] 表示从顶点 i 到顶点 j 的边。

图:          邻接矩阵:
  0---1         0  1  2  3
  |\ /|       0[0, 1, 1, 0]
  | X |       1[1, 0, 1, 1]
  |/ \|       2[1, 1, 0, 1]
  2---3       3[0, 1, 1, 0]

核心思路

  • 无向图:matrix[i][j] = matrix[j][i]
  • 有向图:matrix[i][j] 表示 i→j 的边
  • 有权图:存储权重值
  • 无权图:存储 0/1

复杂度分析

操作时间复杂度空间复杂度
初始化O(V²)O(V²)
查询边O(1)-
添加边O(1)-
删除边O(1)-
遍历邻接点O(V)-

Go 代码

Go 实现

type GraphMatrix struct {
    n        int
    directed bool
    matrix   [][]int
}
 
func NewGraphMatrix(n int, directed bool) *GraphMatrix {
    matrix := make([][]int, n)
    for i := range matrix {
        matrix[i] = make([]int, n)
    }
    return &GraphMatrix{n: n, directed: directed, matrix: matrix}
}
 
func (g *GraphMatrix) AddEdge(u, v, weight int) {
    g.matrix[u][v] = weight
    if !g.directed {
        g.matrix[v][u] = weight
    }
}
 
func (g *GraphMatrix) HasEdge(u, v int) bool {
    return g.matrix[u][v] != 0
}
 
func (g *GraphMatrix) GetNeighbors(u int) []int {
    neighbors := []int{}
    for v := 0; v < g.n; v++ {
        if g.matrix[u][v] != 0 {
            neighbors = append(neighbors, v)
        }
    }
    return neighbors
}

💡 优缺点

优点

  • ✅ 查询边的存在性:O(1)
  • ✅ 适合稠密图
  • ✅ 实现简单直观

缺点

  • ❌ 空间复杂度高:O(V²)
  • ❌ 遍历邻接点慢:O(V)
  • ❌ 不适合稀疏图

相关主题


返回:图算法 | 算法学习导航