1. 图论基础概念与核心价值
图论作为离散数学的重要分支,在计算机科学领域有着举足轻重的地位。我第一次接触图论是在解决城市公交线路最优路径问题时,发现它远比线性表和树形结构更能刻画现实世界的复杂关系。图(Graph)由顶点(Vertex)和边(Edge)组成,这种二元关系结构可以建模社交网络、交通系统、任务调度等众多场景。
图的数学定义为G=(V,E),其中V是顶点集合,E是边集合。根据边的方向性可分为有向图和无向图——就像单行道和双向道的区别。在实际编码中,我们常用邻接矩阵和邻接表两种存储结构,它们各有优劣:邻接矩阵适合稠密图,能快速判断顶点连通性;邻接表则节省空间,特别适合边数较少的稀疏图。
经验之谈:新手常犯的错误是混淆顶点编号和实际业务ID。建议建立映射表,既保持内部处理效率,又不丢失业务语义。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 图的存储结构深度解析
2.1 邻接矩阵实现细节
邻接矩阵用二维数组表示顶点间的连接关系。对于无向图,矩阵是对称的;有向图则可能不对称。以下是典型实现代码:
c复制#define MAX_VERTEX 100
int adjMatrix[MAX_VERTEX][MAX_VERTEX];
void addEdge(int src, int dest, int isDirected) {
adjMatrix[src][dest] = 1;
if(!isDirected) adjMatrix[dest][src] = 1;
}
空间复杂度为O(V²),适合边数接近顶点数平方的情况。我在电商推荐系统项目中就采用这种结构,因为需要频繁查询用户-商品间的关联强度。
2.2 邻接表的优化实践
邻接表通过链表存储每个顶点的邻居,空间复杂度降至O(V+E)。现代实现常用动态数组替代链表以提高缓存命中率:
python复制class Graph:
def __init__(self, vertex_count):
self.adjList = [[] for _ in range(vertex_count)]
def add_edge(self, src, dest, isDirected=False):
self.adjList[src].
