“图”(Graph)是一种抽象数据结构,用于表示对象(称为“顶点”或“节点”)之间的关系。这些关系通常以边(Edge)的形式存在,边可以是有向的(Directed Edge)或无向的(Undirected Edge),并可能带有权重(Weight)或其他附加信息。图可以用来描述各种现实世界的问题,如网络拓扑、社交网络、路线规划、软件工程中的依赖关系等。以下是图的基本概念和相关术语:
基本构成元素:
-
顶点(Vertex):图中的基本单元,通常用圆圈或小方框表示。每个顶点代表一个对象或实体。
-
边(Edge):连接顶点的线段,表示顶点之间的某种关系。根据边的性质,图可以分为:
-
无向图(Undirected Graph):边没有方向,表示顶点间的关系是对称的。例如,无向图可以表示朋友关系,若A和B之间有一条边,意味着A是B的朋友,同时也意味着B是A的朋友。
-
有向图(Directed Graph):边有方向,表示从一个顶点到另一个顶点的单向关系。例如,有向图可以表示网页超链接,一条从A指向B的边意味着页面A链接到页面B,但不一定意味着B链接回A。
有时边还会带有权重(Weight),表示关联强度、距离、成本等额外信息。
-
特殊类型的图:
-
完全图(Complete Graph):如果图中任意两个不同的顶点之间都恰好有一条边(无向图)或一条有向边(有向图),则称此图为完全图。
-
连通图(Connected Graph):在无向图中,如果从任一顶点出发可以通过一系列边到达其他所有顶点,则称此图为连通图。对于有向图,若从每个顶点都能够到达其他所有顶点,并且反过来也能被其他顶点到达,则称为强连通图。
-
环(Cycle):在一个图中,如果存在至少一个顶点序列v1, v2, ..., vk (k ≥ 3),使得vi与vi+1之间存在边,并且vk与v1之间也存在边(对于无向图,边的方向不重要),则称这个顶点序列形成了一个环。无环图(Acyclic Graph)是指不含任何环的图。
图的表示方法:
-
邻接矩阵(Adjacency Matrix):用一个二维数组表示图,数组的行和列对应顶点,数组中的元素值表示对应顶点间是否存在边以及边的权重(如果有)。对于稀疏图(边的数量远小于顶点数量的平方),邻接矩阵可能会浪费大量空间。
-
邻接表(Adjacency List):为图中的每个顶点维护一个列表,列表中存储与该顶点相邻的所有顶点及其对应的边的信息。邻接表对于稀疏图来说更节省空间。
图的算法应用广泛,包括但不限于:
-
搜索算法:深度优先搜索(DFS)、广度优先搜索(BFS)用于遍历图中的所有顶点或找到特定顶点。
-
最短路径问题:Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法用于求解图中两点间或所有顶点对间的最短路径。
-
最小生成树:Prim算法、Kruskal算法用于构建一个包含图中所有顶点、总权重最小的树形结构。
-
最大流/最小割问题:Ford-Fulkerson算法、Edmonds-Karp算法等解决网络流问题,寻找在给定容量限制下从源点到汇点的最大流量或最小割集。
-
图的匹配问题:如匈牙利算法解决二分图的最大匹配问题。