边集数组

📌 定义

边集数组直接存储所有的边,每条边用一个结构体或元组表示。

图:          边集数组:
  0---1      [(0, 1, 5),
  |\ /|       (0, 2, 3),
  | X |       (1, 2, 2),
  |/ \|       (1, 3, 6),
  2---3       (2, 3, 4)]

核心思路

  • 边的表示:(起点, 终点, 权重)
  • 无向图:每条边可存储一次或两次
  • 排序友好:便于按权重排序
  • 适用场景:并查集、最小生成树

复杂度分析

操作时间复杂度空间复杂度
初始化O(E)O(E)
查询边O(E)-
添加边O(1)-
排序边O(E log E)-

Go 代码

Go 实现

type Edge struct {
    U, V, Weight int
}
 
type GraphEdges struct {
    n        int
    directed bool
    edges    []Edge
}
 
func NewGraphEdges(n int, directed bool) *GraphEdges {
    return &GraphEdges{
        n:        n,
        directed: directed,
        edges:    []Edge{},
    }
}
 
func (g *GraphEdges) AddEdge(u, v, weight int) {
    g.edges = append(g.edges, Edge{U: u, V: v, Weight: weight})
    if !g.directed {
        g.edges = append(g.edges, Edge{U: v, V: u, Weight: weight})
    }
}
 
func (g *GraphEdges) SortEdges() {
    sort.Slice(g.edges, func(i, j int) bool {
        return g.edges[i].Weight < g.edges[j].Weight
    })
}
 
func (g *GraphEdges) GetEdges() []Edge {
    return g.edges
}

💡 优缺点

优点

  • ✅ 空间效率高:O(E)
  • ✅ 便于按权重排序
  • ✅ 适合 Kruskal 算法
  • ✅ 适合并查集

缺点

  • ❌ 查询边慢:O(E)
  • ❌ 查找邻接点慢:O(E)
  • ❌ 不适合遍历

🎯 应用场景

边集数组主要用于:

  • Kruskal 算法:按权重排序边
  • 并查集:处理连通性
  • 边的批处理:需要对所有边进行操作

📚 示例应用

相关主题


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