图的表示

📌 核心概念

图(Graph)是由顶点(Vertex)和边(Edge)组成的数据结构,用于表示对象之间的关系。

图的分类:

  • 有向图/无向图:边是否有方向
  • 有权图/无权图:边是否有权重
  • 连通图/非连通图:任意两点是否可达
  • 有环图/无环图(DAG):是否存在环

💻 图的表示方法

🎯 方法对比与选择

复杂度对比

操作邻接矩阵邻接表边集数组
空间复杂度O(V²)O(V+E)O(E)
添加边O(1)O(1)O(1)
删除边O(1)O(degree)O(E)
查询边O(1)O(degree)O(E)
遍历邻居O(V)O(degree)O(E)
遍历所有边O(V²)O(V+E)O(E)

💡 实际应用示例

Go 代码

// 邻接表表示
type Graph struct {
    n        int
    directed bool
    adj      map[int][]int
}
 
func NewGraph(n int, directed bool) *Graph {
    return &Graph{
        n:        n,
        directed: directed,
        adj:      make(map[int][]int),
    }
}
 
func (g *Graph) AddEdge(u, v int) {
    g.adj[u] = append(g.adj[u], v)
    if !g.directed {
        g.adj[v] = append(g.adj[v], u)
    }
}
 
func (g *Graph) GetNeighbors(u int) []int {
    return g.adj[u]
}
 
// 从边列表构建图
func buildGraph(n int, edges [][]int) map[int][]int {
    graph := make(map[int][]int)
 
    for _, edge := range edges {
        u, v := edge[0], edge[1]
        graph[u] = append(graph[u], v)
        graph[v] = append(graph[v], u)
    }
 
    return graph
}
 
// 有权图
type WeightedGraph struct {
    n   int
    adj map[int][]Edge
}
 
type Edge struct {
    to     int
    weight int
}
 
func NewWeightedGraph(n int) *WeightedGraph {
    return &WeightedGraph{
        n:   n,
        adj: make(map[int][]Edge),
    }
}
 
func (g *WeightedGraph) AddEdge(u, v, weight int) {
    g.adj[u] = append(g.adj[u], Edge{v, weight})
    g.adj[v] = append(g.adj[v], Edge{u, weight})
}

🎯 经典题目

题目LeetCode关键点
克隆图133图的复制
课程表207有向图表示
网络延迟时间743有权图
冗余连接684无向图找环
冗余连接II685有向图找环

返回:图算法