图
在数据结构中,图(Graph)是由节点(Vertex)和边(Edge)组成的一种非线性数据结构。图可以用来表示不同事物之间的关系,比如社交网络中的用户和好友关系、城市之间的道路网络等。
图的基本组成部分包括:
-
节点(Vertex):也称为顶点或点,表示图中的一个元素或对象。每个节点可以有一个或多个属性,比如名称、值等。
-
边(Edge):表示两个节点之间的连接关系。边可以是有向的(指定连接的方向)或无向的(没有指定连接的方向),也可以带有权重(表示连接的权重或距离)。
-
路径(Path):由一系列节点和连接它们的边组成的序列。路径可以是有向的或无向的,可以是闭合的(起点和终点相同)或开放的。
-
无向图(Undirected Graph):所有边都是无向的,即没有指定连接的方向。
-
有向图(Directed Graph):边具有方向,从一个节点指向另一个节点。
-
加权图(Weighted Graph):边具有权重或距离,表示节点之间的某种度量。
-
连通图(Connected Graph):图中的任意两个节点之间都存在路径。
-
子图(Subgraph):图中的一部分节点和边的集合,仍然构成一个图。
图可以用多种方式实现,包括邻接矩阵、邻接表和关联矩阵等。常见的图算法有深度优先搜索(DFS)、广度优先搜索(BFS)、最短路径算法(如Dijkstra算法和Floyd-Warshall算法)、最小生成树算法(如Prim算法和Kruskal算法)等。
图在计算机科学中有广泛的应用,包括社交网络分析、路由算法、图像处理、电路设计等领域。
生成树边数等于顶点数-1 极小!!!
图的存储矩阵
(1)图的邻接矩阵
n个顶点的无向连通图用邻接矩阵表示时,该矩阵至少有2n一2个非零元素
V顶点 E边
图的遍历
图的遍历是指按照一定的规则,依次访问图中的所有节点,确保每个节点都被访问且仅被访问一次的过程。常用的图遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
-
深度优先搜索(DFS):
- 选择一个起始节点作为当前节点,并将其标记为已访问。
- 从当前节点出发,依次访问与该节点相邻且未被访问过的节点。
- 对于每个未被访问的相邻节点,重复上述步骤直到所有节点都被访问。
-
广度优先搜索(BFS):
- 选择一个起始节点作为当前节点,并将其标记为已访问。
- 将当前节点加入到一个队列中。
- 从队列中取出一个节点作为当前节点,访问该节点的所有未被访问过的相邻节点,并将它们标记为已访问。
- 将这些相邻节点加入队列中。
- 重复上述步骤直到队列为空。
这两种遍历算法都能够访问图中的所有节点,只是访问顺序不同。DFS按照深度优先的原则,先访问一个节点的所有相邻节点,然后再递归地访问下一个节点的相邻节点。而BFS按照广度优先的原则,先访问一个节点的所有相邻节点,然后再逐层地访问下一个节点的相邻节点。
这些遍历算法在解决图相关的问题时非常有用,例如寻找路径、判断连通性、查找最短路径等。具体选择哪种遍历算法取决于具体的问题需求。
最小生成树
最小生成树(Minimum Spanning Tree,简称MST)是指在一个连通图中选择一棵树,使得这棵树包含图中的所有节点,并且总权值最小。
常用的求解最小生成树的算法有以下两种:
-
Prim算法:
- 选择一个起始节点,将其加入到最小生成树中。
- 在剩余的节点中,找到与当前最小生成树连接的边的最小权值边所连接的节点,并将其加入到最小生成树中。
- 重复上述步骤直到最小生成树包含图中的所有节点。
-
Kruskal算法:
- 将图中的所有边按照权值从小到大进行排序。
- 依次选择权值最小的边,并判断是否会形成环路。如果不会形成环路,则将该边加入到最小生成树中。
- 重复上述步骤直到最小生成树包含图中的所有节点。
这两种算法都可以求解最小生成树,但是它们的思想和实现方式略有不同。Prim算法从一个起始节点开始,逐步扩展最小生成树,直到包含所有节点。Kruskal算法则通过按照边权值排序的方式,依次选择边,并判断是否形成环路来构建最小生成树。
最小生成树在实际应用中非常重要,例如在网络设计、电力传输、通信网络等领域都有广泛的应用。求解最小生成树可以帮助我们找到一个具有最小成本或最小距离的连通子图,以满足特定的需求。
最短路径
最短路径是指在图中找到两个节点之间的最短路径,即路径上的边权重之和最小。
常用的求解最短路径的算法有以下三种:
-
Dijkstra算法:
- 选择一个起始节点,并将其到起始节点的距离初始化为0,其他节点的距离初始化为正无穷。
- 从未标记的节点中选择距离起始节点最近的节点,将其标记为已访问。
- 对于该节点的所有未标记的相邻节点,更新它们到起始节点的距离,如果经过当前节点到达相邻节点的路径比之前的路径更短。
- 重复上述步骤直到所有节点都被标记为已访问或者没有可选的节点。
-
Bellman-Ford算法:
- 将所有节点的距离初始化为正无穷,起始节点的距离初始化为0。
- 依次对图中的边进行松弛操作,即通过当前边缩短起始节点到相邻节点的距离。
- 重复对所有边进行松弛操作,直到没有可更新的距离为止。
- 如果还存在可以更新的距离,则说明图中存在负权回路。
-
Floyd-Warshall算法:
- 初始化一个二维数组,记录任意两个节点之间的距离。
- 通过三层循环,分别遍历所有节点对,更新它们之间的最短路径。
- 最后得到一个二维数组,其中记录了任意两个节点之间的最短路径。
这些算法可以用于求解不同情况下的最短路径问题。Dijkstra算法适用于单源最短路径问题,即从一个起始节点到其他所有节点的最短路径。Bellman-Ford算法适用于解决含有负权边的最短路径问题,而Floyd-Warshall算法适用于求解任意两个节点之间的最短路径。
最短路径算法在实际应用中有广泛的应用,例如路由选择、导航系统、货物配送等领域。通过求解最短路径,可以帮助我们找到在图中最快或最经济的路径,以满足特定的需求。
拓扑排序
拓扑排序是一种对有向无环图(DAG)进行排序的算法。它可以将图中的节点按照一定的顺序进行排序,使得所有的依赖关系都得到满足。
具体的拓扑排序算法如下:
- 统计每个节点的入度(即指向该节点的边的数量)。
- 初始化一个队列,并将所有入度为0的节点加入队列中。
- 从队列中取出一个节点,并将其加入结果集中。
- 对于该节点的所有邻接节点,将其入度减1。
- 如果某个节点的入度变为0,则将其加入队列中。
- 重复步骤3到步骤5,直到队列为空。
如果图中存在环路,则无法进行拓扑排序,因为环路中的节点互相依赖,无法确定它们之间的相对顺序。
拓扑排序可以用于解决许多实际问题,例如任务调度、编译顺序的确定、依赖关系分析等。通过拓扑排序,我们可以确定节点之间的执行顺序,确保依赖关系得到满足,从而有效地解决相关问题。
AOE网
AOE 网(Activity On Edge Network)是一种以有向边表示活动(Activity),以顶点表示活动之间的事件(Event)和控制关系的有向无环图(DAG)。
在 AOE 网中,每条有向边表示一个活动,而顶点则表示活动之间的事件或者控制关系。与 AOV 网不同,AOE 网在边上标注了活动的持续时间或者其他相关信息。
AOE 网通常用于表示工程项目的网络计划,其中活动之间存在着先后顺序、依赖关系以及活动的持续时间。通过对 AOE 网进行网络计划的分析,可以确定整个工程项目的最早开始时间、最晚开始时间、关键路径等关键信息。
在 AOE 网中,顶点表示事件,有向边表示活动,每个顶点都有两个时间属性:最早发生时间(EST,Earliest Start Time)和最迟发生时间(LST,Latest Start Time)。通过计算这些时间属性,可以确定活动的最早开始时间、最晚开始时间以及整个项目的关键路径。
AOE 网的关键路径是指项目中耗时最长的路径,它决定了整个项目的最短完成时间。通过计算关键路径,可以确定项目中哪些活动对整个项目的进度具有关键影响。
总结来说,AOE 网是一种用于表示工程项目网络计划的有向无环图,其中边表示活动,顶点表示事件或者控制关系。通过对 AOE 网进行分析,可以确定项目的最早开始时间、最晚开始时间、关键路径等关键信息。