由顶点集 和边集 组成,记为

基本概念

  • 有向图 / 无向图:边是否有方向
  • 简单图 / 多重图:是否存在重复边或顶点到自身的边
  • 完全图:任意两个顶点之间都存在边
  • 子图:顶点集和边集都是原图子集
  • 连通、连通图和连通分量:无向图中顶点间是否有路径相连
  • 强连通图、强连通分量:有向图中顶点间双向可达
  • 生成树 / 生成森林:包含全部顶点的极小连通子图
  • 顶点的度、入度和出度:与该顶点相关联的边的数目
  • 边的权和网:边上带有权值
  • 稠密图 / 稀疏图:按边数与顶点数的相对多少划分
  • 路径、路径长度和回路:顶点序列及其经过的边数
  • 简单路径 / 简单回路:顶点不重复出现的路径/回路
  • 距离:两顶点间最短路径的长度

存储结构

邻接矩阵法

用一个 的二维数组存储顶点间的邻接关系,适合稠密图。

邻接表法

为每个顶点建立一个单链表存储其邻接顶点,适合稀疏图。

其他

十字链表(有向图)、邻接多重表(无向图)。

图的基本操作

  • Adjacent(G, x, y):判断边 是否存在
  • Neighbors(G, x):列出顶点 的邻接边
  • InsertVertex(G, x) / AddEdge(G, x, y) / RemoveEdge(G, x, y)
  • FirstNeighbor(G, x) / NextNeighbor(G, x, y)
  • Get_edge_value(G, x, y) / Set_edge_value(G, x, y, v)

遍历

广度优先搜索 BFS

  • 空间复杂度
  • 邻接表时间复杂度
  • 邻接矩阵时间复杂度
  • 可用于求解单源最短路径问题、生成广度优先生成树

深度优先搜索 DFS

  • 空间复杂度
  • 邻接表时间复杂度
  • 邻接矩阵时间复杂度
  • 可生成深度优先生成树/生成森林

应用

  • 最小生成树(MST):Prim 算法、Kruskal 算法
  • 最短路径:Dijkstra 算法(单源)、Floyd 算法(多源)
  • 拓扑排序(AOV 网)
  • 关键路径(AOE 网)