图是最灵活也最复杂的数据结构。选择合适的存储方式(邻接矩阵/邻接表/边列表)和遍历策略(DFS/BFS)是解决所有图论问题的基础。
一、图的分类
Mermaid · 渲染中(下方为源码)
graph LR G[图] --> M[邻接矩阵] G --> L[邻接表] G --> E[边列表] M --> A[稠密图友好] L --> B[稀疏图友好]
| 维度 | 类型 |
|---|---|
| 方向 | 有向图 / 无向图 |
| 权重 | 有权图 / 无权图 |
| 连通性 | 连通图 / 非连通图 |
| 特殊 | DAG、完全图、二分图、树 |
二、存储方式
邻接矩阵
int[][] adj = new int[n][n]; // adj[i][j] = 权重(0 表示无边)
// 适合稠密图,空间 O(V²)邻接表
List<Integer>[] adj = new ArrayList[n];
for (int i = 0; i < n; i++) adj[i] = new ArrayList<>();
// 加边
adj[u].add(v);
adj[v].add(u); // 无向图
// 适合稀疏图,空间 O(V+E)边列表
int[][] edges = new int[m][3]; // {from, to, weight}
// 适合 Kruskal、Bellman-Ford 等按边操作的算法