当前位置: 首页 > news >正文

详细介绍:【数据结构】图论核心应用:关键路径算法详解——从AOE网到项目管理实战​

详细介绍:【数据结构】图论核心应用:关键路径算法详解——从AOE网到项目管理实战​

关键路径

  • 导读
  • 一、重要概念
    • 1.1 AOE网
    • 1.2 关键路径
  • 二、关键路径算法
    • 2.1 算法步骤
    • 2.2 实例演示
    • 2.3 关键活动与关键路径的特性
  • 结语

图的基本应用

导读

大家好,很高兴又和大家见面啦!!!

在之前的图论学习中,大家已经掌握了拓扑排序这一核心概念。

拓扑排序是针对有向无环图(DAG)的一种线性序列,它要求对于图中的任意一条有向边(u,v),在序列中u都出现在v之前。

这种排序方法在任务调度、依赖关系分析等场景中有着广泛的应用。

与拓扑排序相对应的是逆拓扑排序:

它要求对于任意一条有向边(u,v),在序列中v都出现在u之前。

这两种排序方法虽然方向相反,但都体现了有向无环图中活动之间的前后依赖关系。

今天,我们将在这两种排序方法的基础上,深入探讨图论中的一个核心应用——关键路径分析

关键路径方法源于项目管理领域,用于确定工程中哪些任务的时间延迟会直接影响整个项目的完成时间。

  • 凭借拓扑排序,我们可以确定项目中各个事件的合理发生顺序;
  • 通过通过逆拓扑排序,我们则能够分析在不影响总工期的前提下,各个事件最迟应该何时发生。

这两种分析方法的结合,正是求解关键路径的核心思路。

在本文中,我们将第一介绍AOE网Activity On Edge network)这一重要概念,然后详细讲解如何通过拓扑排序和逆拓扑排序来求解关键路径,并通过具体实例演示整个计算过程。

掌握关键路径分析方法,不仅有助于理解项目管理中的时间优化障碍,也为后续学习更多高级图算法奠定坚实基础。

让我们开始探索如何找出那些"牵一发而动全身"的关键活动吧!

一、重要概念

1.1 AOE网

在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示结束该活动的开销(如做完活动所需的时间),称之为用边表示活动的网络,简称AOE网

AOV网一样,AOE网同样为有向无环图(DAG图),不过不同的是,二者的边和顶点所代表的含义是不同的:

  • AOV网:顶点表示活动,有向边表示活动的先后顺序,有向边并无权值
  • AOE网:顶点表示事件,有向边表示活动,边权值表示完成该活动的开销

AOE网具有一下两个性质:

  1. 只有在某顶点所代表的事件发生后,从该顶点出发的各有向边所代表的活动才能开始;
  2. 只有在进入某顶点的各有向边所代表的活动都已结束时,该顶点所代表的事件才能发生
买苹果5min
洗苹果3min
洗苹果3min
削苹果皮5min
准备买苹果
到家洗苹果
吃苹果
开始削皮

这里可能有点绕,这里我们通过吃苹果这个工程来进行理解:

  • 只有在准备买苹果这个事件发生后,买苹果这个活动才能开始;

  • 对于吃苹果这个顶点的所代表的事件,只有在指向该顶点的所有有向边所代表的活动(洗苹果3min与削苹果皮5min)都已经结束时,该事件才能发生;

AOE网中,仅有一个入度为0的顶点,称为开始顶点源点),它表示整个工程的开始;也仅有一个出度为0的顶点,称为结束顶点汇点),它表示整个工程的结束。

1.2 关键路径

AOE网中,有些活动是可以并行进行的。这里大家将吃苹果这个工程给稍作修改:

在上图中,我们以开始这一顶点作为源点,当开始这一事件发生后,买苹果和买水果刀这两个活动是可以并行进行的,就比如,我们允许自己去买苹果,让家里的其他人去买水果刀,因此这两个活动可以并行进行。

从源点到汇点的有向路径可能有多条,并且这些路径长度可能不同。就比如上图中就存在两条路径:

完毕不同路径上的活动所需的时间尽管不同,但是只有所有路径上的活动都已结束,整个工程才能算结束。因此,从源点到汇点的所有路径中,具有最大路径长度的路径称为关键路径,而把关键路径上的活动称为关键活动

就如上述两条路径的长度分别为:

该工程的就是对于这两条路径而言,路径1的长度明显大于路径2的长度,因此路径1就关键路径,该路径上的活动(买苹果、洗苹果、削苹果皮)就是关键活动

结束整个工程的最短时间就是关键路径的长度,即关键路径上个活动花费开销的总和。也就是说,完成吃苹果这个工程的最短时间需要花费9min。

这是因为关键活动影响了整个工程的时间,即若关键活动不能按时完毕,则整个工程的完成时间就会延长。如下所示:

延长到了5min,那么整个工程的做完的最短时间就由原先的9min延长到了11min。就是当原本仅需3min买苹果的时间没能按时完成,而

因此,只要找到了关键活动,就找到了关键路径,也就可以得出最短搞定时间。

在关键活动中,有以下参量我们需要了解:

v e v_eve(源点) = 0
v e ( k ) = M a x { v e ( j ) + W e i g h t ( v j , v k ) } v_e(k) = Max\{v_e(j) + Weight(v_j, v_k)\}ve(k)=Max{ve(j)+Weight(vj,vk)}v k v_kvkv j v_jvj的任意后继,W e i g h t ( v j , v k ) Weight(v_j, v_k)Weight(vj,vk) 表示 < v j , v k > <v_j, v_k><vj,vk> 上的权值

v l v_lvl(汇点) =v e v_eve(汇点)
v l ( k ) = M i n { v l ( j ) − W e i g h t ( v k , v j ) } , v k v_l(k) = Min\{v_l(j) - Weight(v_k, v_j)\}, v_kvl(k)=Min{vl(j)Weight(vk,vj)},vkv j v_jvj 的任意前驱

二、关键路径算法

2.1 算法步骤

求关键路径的算法步骤如下所示:

2.2 实例演示

接下来我们根据下面的实例来理解算法的各个步骤:

a1 = 3
a4 = 3
a8 = 1
a3 = 2
a7 = 2
a5 = 4
a2 = 2
a6 = 3
v1
v2
v5
v6
v4
v3

第一步:从源点出发,令v e v_eve(源点) = 0 ,按拓扑有序求其余顶点的最早发生时间v e ( ) v_e()ve()

按照拓扑排序的规则,我们可以得到其中一个拓扑排序序列为:

  • v 1 , v 2 , v 3 , v 4 , v 5 , v 6 v_1, v_2, v_3, v_4, v_5, v_6v1,v2,v3,v4,v5,v6

按照该顺序,我们依次对个顶点的最早发生时间进行求解:

  • v e 1 = 0 v_{e_1} = 0ve1=0:对于源点,该事件的最早发生时间肯定事从零时刻开始,因此其最早发生时间为:v e 1 = 0 v_{e_1} = 0ve1=0

  • v e 2 = M a x { v e 1 + a 1 } v_{e_2} = Max\{v_{e_1} + a_1\}ve2=Max{ve1+a1}:对于顶点2,该事件要想发生,就一定得等活动a 1 a_1a1 结束后,而 a 1 = 3 a_1 = 3a1=3,因此,该顶点事件的最早发生时间为:v e 2 = M a x { 0 + 3 } = 3 v_{e_2} = Max\{0 + 3\} = 3ve2=Max{0+3}=3

  • v e 3 = M a x { v e 1 + a 2 } v_{e_3} = Max\{v_{e_1} + a_2\}ve3=Max{ve1+a2}:对于顶点3,该事件要想发生,就一定得等活动a 2 a_2a2 结束后,而 a 2 = 2 a_2 = 2a2=2,因此,该顶点事件的最早发生时间为:v e 3 = M a x { 0 + 2 } = 2 v_{e_3} = Max\{0 + 2\} = 2ve3=Max{0+2}=2

  • v e 4 = M a x { v e 2 + a 3 , v e 3 + a 5 } v_{e_4} = Max\{v_{e_2} + a_3, v_{e_3} + a_5\}ve4=Max{ve2+a3,ve3+a5}:对于顶点4,该事件要想发生,就一定得等活动a 3 a_3a3 与活动 a 5 a_5a5均结束后才能发生,而a 3 = 2 , a 5 = 4 a_3 = 2, a_5 = 4a3=2,a5=4,因此,该顶点事件的最早发生时间为:v e 4 = M a x { 3 + 2 , 2 + 4 } = M a x { 5 , 6 } = 6 v_{e_4} = Max\{3 + 2, 2 + 4\} = Max\{5, 6\} = 6ve4=Max{3+2,2+4}=Max{5,6}=6

  • v e 5 = M a x { v e 2 + a 4 } v_{e_5} = Max\{v_{e_2} + a_4\}ve5=Max{ve2+a4}:对于顶点5,该事件要想发生,就一定得等活动a 4 a_4a4 结束后,而 a 4 = 3 a_4 = 3a4=3,因此,该顶点事件的最早发生时间为:v e 5 = M a x { 3 + 3 } = 6 v_{e_5} = Max\{3 + 3\} = 6ve5=Max{3+3}=6

  • v e 6 = M a x { v e 5 + a 8 , v e 4 + a 7 , v e 3 + a 6 } v_{e_6} = Max\{v_{e_5} + a_8, v_{e_4} + a_7, v_{e_3} + a_6\}ve6=Max{ve5+a8,ve4+a7,ve3+a6}:对于顶点6,该事件要想发生,就一定得等活动a 6 , a 7 , a 8 a_6, a_7, a_8a6,a7,a8均结束后才能发生,而a 6 = 3 , a 7 = 2 , a 8 = 1 a_6 = 3, a_7 = 2, a_8 = 1a6=3,a7=2,a8=1,因此,该顶点事件的最早发生时间为:v e 6 = M a x { 6 + 1 , 6 + 2 , 2 + 3 } = M a x { 7 , 8 , 5 } = 8 v_{e_6} = Max\{6 + 1, 6 + 2, 2 + 3\} = Max\{7, 8, 5\} = 8ve6=Max{6+1,6+2,2+3}=Max{7,8,5}=8

第二步:从汇点出发,令v l v_lvl(汇点) =v e v_eve(汇点),按逆拓扑有序求其余顶点的最迟发生时间v l ( ) v_l()vl()

按照逆拓扑排序规则,我们许可得到其中一个逆拓扑排序序列为:

  • v 6 , v 5 , v 4 , v 3 , v 2 , v 1 v_6, v_5, v_4, v_3, v_2, v_1v6,v5,v4,v3,v2,v1

按照该顺序,我们依次对各个顶点的最迟发生时间进行求解:

  • v l 6 = v e 6 v_{l_6} = v_{e_6}vl6=ve6:对于汇点,我们假设该事件的最迟发生时间与最早发生时间一致,那么其对应的最迟发生时间则为:v 6 = 8 v_6 = 8v6=8

  • v l 5 = M i n { v l 6 − a 8 } v_{l_5} = Min\{v_{l_6} - a_8\}vl5=Min{vl6a8}:对于顶点5,在他开始后,要想让顶点6的事件准时开始,那么他就一定要给活动a 8 a_8a8留出足够的时间,而a 8 = 1 a_8 = 1a8=1,因此,顶点5的最迟发生时间为:v l 5 = M i n { 8 − 1 } = 7 v_{l_5} = Min\{8 - 1\} = 7vl5=Min{81}=7

  • v l 4 = M i n { v l 6 − a 7 } v_{l_4} = Min\{v_{l_6} - a_7\}vl4=Min{vl6a7}:对于顶点4,在他开始后,要想让顶点6的事件准时开始,那么他就一定要给活动a 7 a_7a7留出足够的时间,而a 7 = 2 a_7 = 2a7=2,因此,顶点4的最迟发生时间为:v l 4 = M i n { 8 − 2 } = 6 v_{l_4} = Min\{8 - 2\} = 6vl4=Min{82}=6

  • v l 3 = M i n { v l 6 − a 6 , v l 4 − a 5 } v_{l_3} = Min\{v_{l_6} - a_6, v_{l_4} - a_5\}vl3=Min{vl6a6,vl4a5}:对于顶点3,在他开始后,要想让顶点6与顶点4的事件准时开始,那么他就一定要给活动a 6 , a 5 a_6,a_5a6a5留出足够的时间,而a 6 = 3 , a 5 = 4 a_6 = 3, a_5 = 4a6=3,a5=4,因此,顶点3的最迟发生时间为:v l 3 = M i n { 8 − 3 , 6 − 4 } = 2 v_{l_3} = Min\{8 - 3, 6 - 4\} = 2vl3=Min{83,64}=2

  • v l 2 = M i n { v l 5 − a 4 , v l 4 − a 2 } v_{l_2} = Min\{v_{l_5} - a_4, v_{l_4} - a_2\}vl2=Min{vl5a4,vl4a2}:对于顶点2,在他开始后,要想让顶点5与顶点4的事件准时开始,那么他就一定要给活动a 4 , a 3 a_4,a_3a4a3留出足够的时间,而a 4 = 3 , a 3 = 2 a_4 = 3, a_3 = 2a4=3,a3=2,因此,顶点2的最迟发生时间为:v l 2 = M i n { 7 − 3 , 6 − 2 } = 4 v_{l_2} = Min\{7 - 3, 6 - 2\} = 4vl2=Min{73,62}=4

  • v l 1 = M i n { v l 2 − a 1 , v l 3 − a 2 } v_{l_1} = Min\{v_{l_2} - a_1, v_{l_3} - a_2\}vl1=Min{vl2a1,vl3a2}:对于顶点1,在他开始后,要想让顶点2与顶点3的事件准时开始,那么他就一定要给活动a 1 , a 2 a_1,a_2a1a2留出足够的时间,而a 1 = 3 , a 2 = 2 a_1 = 3, a_2 = 2a1=3,a2=2,因此,顶点1的最迟发生时间为:v l 3 = M i n { 4 − 3 , 2 − 2 } = 0 v_{l_3} = Min\{4 - 3, 2 - 2\} = 0vl3=Min{43,22}=0

现在我们就得到了各个顶点的最早开始时间与最迟开始时间,如下所示:

v1v2v3v4v5v6
最早开始时间ve032668
最迟开始时间vl042678

第三步:根据各顶点的v e ( ) v_e()ve()值求所有弧的最早开始时间e ( ) e()e()

按照前面我们求出的各顶点的最早开始时间,我们就行求得各弧的最早开始时间:

  • < v 1 , v 2 > <v_1, v_2><v1,v2>:其表示的活动为a 1 a_1a1,因此其最早开始时间为:e 1 = v e 1 = 0 e_1 = v_{e_1} = 0e1=ve1=0

  • < v 1 , v 3 > <v_1, v_3><v1,v3>:其表示的活动为a 2 a_2a2,因此其最早开始时间为:e 2 = v e 1 = 0 e_2 = v_{e_1} = 0e2=ve1=0

  • < v 2 , v 4 > <v_2, v_4><v2,v4>:其表示的活动为a 3 a_3a3,因此其最早开始时间为:e 3 = v e 2 = 3 e_3 = v_{e_2} = 3e3=ve2=3

  • < v 2 , v 5 > <v_2, v_5><v2,v5>:其表示的活动为a 4 a_4a4,因此其最早开始时间为:e 4 = v e 2 = 3 e_4 = v_{e_2} = 3e4=ve2=3

  • < v 3 , v 4 > <v_3, v_4><v3,v4>:其表示的活动为a 5 a_5a5,因此其最早开始时间为:e 5 = v e 3 = 2 e_5 = v_{e_3} = 2e5=ve3=2

  • < v 3 , v 6 > <v_3, v_6><v3,v6>:其表示的活动为a 6 a_6a6,因此其最早开始时间为:e 6 = v e 3 = 2 e_6 = v_{e_3} = 2e6=ve3=2

  • < v 4 , v 6 > <v_4, v_6><v4,v6>:其表示的活动为a 7 a_7a7,因此其最早开始时间为:e 7 = v e 4 = 6 e_7 = v_{e_4} = 6e7=ve4=6

  • < v 5 , v 6 > <v_5, v_6><v5,v6>:其表示的活动为a 8 a_8a8,因此其最早开始时间为:e 8 = v e 5 = 6 e_8 = v_{e_5} = 6e8=ve5=6

第四步:根据各顶点的v l ( ) v_l()vl()值求所有弧的最迟开始时间l ( ) l()l()

同理,我们也可以求得各弧的最迟开始时间:

  • < v 1 , v 2 > <v_1, v_2><v1,v2>:其表示的活动为a 1 a_1a1,因此其最迟开始时间为:l 1 = v l 2 − a 1 = 4 − 3 = 1 l_1 = v_{l_2} - a_1= 4 - 3 = 1l1=vl2a1=43=1

  • < v 1 , v 3 > <v_1, v_3><v1,v3>:其表示的活动为a 2 a_2a2,因此其最迟开始时间为:l 2 = v l 3 − a 2 = 2 − 2 = 0 l_2 = v_{l_3} - a_2 = 2 - 2 = 0l2=vl3a2=22=0

  • < v 2 , v 4 > <v_2, v_4><v2,v4>:其表示的活动为a 3 a_3a3,因此其最迟开始时间为:l 3 = v l 4 − a 3 = 6 − 2 = 4 l_3 = v_{l_4} - a_3= 6 - 2 = 4l3=vl4a3=62=4

  • < v 2 , v 5 > <v_2, v_5><v2,v5>:其表示的活动为a 4 a_4a4,因此其最迟开始时间为:l 4 = v l 5 − a 4 = 7 − 3 = 4 l_4 = v_{l_5} - a_4 = 7 - 3 = 4l4=vl5a4=73=4

  • < v 3 , v 4 > <v_3, v_4><v3,v4>:其表示的活动为a 5 a_5a5,因此其最迟开始时间为:l 5 = v l 4 − a 5 = 6 − 4 = 2 l_5 = v_{l_4} - a_5 = 6 - 4 = 2l5=vl4a5=64=2

  • < v 3 , v 6 > <v_3, v_6><v3,v6>:其表示的活动为a 6 a_6a6,因此其最迟开始时间为:l 6 = v l 6 − a 6 = 8 − 3 = 5 l_6 = v_{l_6} - a_6 = 8 - 3 = 5l6=vl6a6=83=5

  • < v 4 , v 6 > <v_4, v_6><v4,v6>:其表示的活动为a 7 a_7a7,因此其最迟开始时间为:l 7 = v l 6 − a 7 = 8 − 2 = 6 l_7 = v_{l_6} - a_7 = 8 - 2 = 6l7=vl6a7=82=6

  • < v 5 , v 6 > <v_5, v_6><v5,v6>:其表示的活动为a 8 a_8a8,因此其最迟开始时间为:l 8 = v l 6 − a 8 = 8 − 1 = 7 l_8 = v_{l_6} - a_8 = 8 - 1 = 7l8=vl6a8=81=7

现在我们就得到了所有弧的最早开始时间与最迟开始时间,如下所示:

a1a2a3a4a5a6a7a8
最早开始时间e00332266
最迟开始时间l10442567

第五步:求 A O E AOEAOE网中所有活动的差额d ( ) d()d() ,找出所有 d ( ) = 0 d() = 0d()=0的活动构成关键路径

根据求得的各弧的最早开始时间与最迟开始时间,我们便可以求得各活动的二者时间差额,如下所示:

a1a2a3a4a5a6a7a8
最迟开始时间l10442567
最早开始时间e00332266
时间差额d10110301

根据差额大家可以找到关键活动:a 2 , a 5 , a 7 a_2, a_5, a_7a2,a5,a7,而这些活动所对应的关键路径为:

a2 = 2
a5 = 4
a7 = 2
v1
v3
v4
v6

2.3 关键活动与关键路径的特性

在一项工程中,关键路径与关键活动具有一下特性:

以吃苹果这个工程来理解这些特性:就是下面我们还

在这个工程中,两条路径:

均为该工程的关键路径,其中活动a 4 a_4a4为两条路径共有的关键活动,那么当大家缩短该工程的时间时,整个工程的工期都会缩短;

当我们缩短活动a 1 a_1a1 或者活动 a 3 a_3a3的时间时,此时路径1不再是关键路径,其路径上的活动也不再是关键活动,因此,其时间变化并不会影响整个工程的工期;

当我们增加某个活动的时间是,整个工程的工期将被延长,且不包含该活动的路径变为非关键路径;

在上图中,关键路径为:

工程的工期为:5 + 3 + 5 = 13 5 + 3 + 5 = 135+3+5=13

结语

今天的内容到这里就全部结束了,通过今天的学习,我们框架掌握了图论中极具实用价值的关键路径分析方法。让我们来详细回顾本文的核心知识点:

  1. AOE网的核心概念

    • 顶点表示事件,有向边表示活动,边权值表示活动开销

    • 与AOV网的区别:AOV网顶点表示活动,AOE网边表示活动

    • 两个重要性质:事件触发活动的开始,活动完成触发事件的发生

    • 仅有一个源点(入度为0)和一个汇点(出度为0)

  2. 关键路径的核心定义

    • 从源点到汇点的最长路径决定了整个工程的最短工期

    • 关键路径上的活动称为关键活动,其延迟会直接影响总工期

    • 工程最短做完时间 = 关键路径的长度

  3. 五大关键参数体系

    • 事件最早发生时间ve(k):ve(k) = Max{ve(j) + Weight(vj, vk)}

    • 事件最迟发生时间vl(k):vl(k) = Min{vl(j) - Weight(vk, vj)}

    • 活动最早开始时间e(i):e(i) = ve(k)(活动起点的最早发生时间)

    • 活动最迟开始时间l(i):l(i) = vl(j) - Weight(vk, vj)

    • 时间余量d(i):d(i) = l(i) - e(i),d(i)=0的活动为关键活动

  4. 关键路径五步算法:

    1. 拓扑排序求所有事件的最早发生时间ve()
    2. 逆拓扑排序求所有事件的最迟发生时间vl()
    3. 根据ve()求所有活动的最早开始时间e()
    4. 根据vl()求所有活动的最迟开始时间l()
    5. 计算时间余量d(),d(i)=0的活动构成关键路径
  5. 关键路径的重要特性

    • 关键活动时间增加 → 总工期延长

    • 关键活动适度缩短 → 总工期缩短

    • 关键活动过度缩短 → 可能转为非关键活动

    • 多关键路径时需同时优化所有路径上的关键活动

学习建议
图论通向实际应用的重要桥梁。就是建议大家亲手重现文中的实例计算,重点掌握五步算法的执行逻辑。关键路径分析在项目管理、工程优化等领域应用广泛,

✨ 点击关注,系统学习图论完整知识体系!

点赞支持 - 让更多需要的朋友看到这篇干货

⭐ 收藏备忘 - 建立个人知识库随时查阅

转发分享 - 帮助更多正在学习图论的同学

评论交流 - 有任何问题欢迎随时讨论

记得关注我,接下来我们将深入讲解图的更多实际应用场景!感谢阅读,我们下期再见!

http://www.hskmm.com/?act=detail&tid=22796

相关文章:

  • tnkstat3e-merge-0
  • JavaScript零基础入门速通(完整) - 指南
  • @RequestParam 什么时候可以省略?
  • 段页式管理方式
  • 推进电子设计革新:为什么模拟仿真正是核心助力?
  • 深入解析:前端开发,iframe 相关经验总结
  • list 容器 listr容器与vector容器 list 示例代码
  • advance 函数
  • *和 指针与地址 ++i和 i++
  • Playwright MCP浏览器自动化详解指南 - 教程
  • 指针和地址的示例运用代码
  • Python获取视频文件的各种属性信息
  • Arduino-Yun-物联网指南-全-
  • 2025雕塑厂家TOP企业品牌推荐排行榜,婚庆泡沫雕塑,玻璃钢,城市地标不锈钢,校园筑铜,道具,文旅,婚礼堂泡沫,直播间实景泡沫,水泥景观,商业美陈发光雕塑公司推荐!
  • Code--Blocks-和-C---应用开发-全-
  • 深入解析:(27)APS.NET Core8.0 堆栈原理通俗理解
  • VMware Service某些服务关闭导致虚拟机开机无法获取IP地址
  • 2025中国无缝钢管厂家 TOP 品牌权威推荐,SA106 无缝钢管,A106B 无缝钢管,SA53B 无缝钢管精选无缝钢管工厂
  • 在AI技术唾手可得的时代,挖掘用户真实需求成为产品成功的关键——某知名设备电量监控工具需求探索
  • 2025 年润滑脂厂家 TOP 企业品牌推荐排行榜,道达尔润滑脂,工业润滑脂,合成润滑脂,高温润滑脂,轴承润滑脂推荐这十家公司!
  • 2025切割机厂家TOP企业品牌推荐排行榜,五轴水刀,大理石水刀,全自动水刀,高压水刀,手持式水刀,高压水刀,大理石水刀,便携式水刀切割机公司推荐!
  • 二十八、API之《System 类》——与框架交互的“桥梁”
  • 2025橡胶木板材厂家TOP企业品牌推荐排行榜,泰国橡胶木板材,橡胶木免漆板,橡胶木 PET,橡胶木门板,AA 橡胶木,橡胶木指接板公司推荐!
  • 2025润滑油供应商最新权威推荐排行榜:聚焦耐磨润滑油、工业润滑油、鑫美工业润滑油、壳牌润滑油、道达尔润滑油助力企业采购决策
  • 多状态循环泵控件开发
  • 2025活塞杆厂家TOP企业品牌推荐排行榜,精密,不锈钢,调制,超长,油缸,气缸,镀铬,大直径,精细活塞杆推荐这十家公司!
  • 2025房屋鉴定机构服务平台推荐排行榜,房屋安全评估,承载力,工程质量,危房,受损伤,舞台架结构安全鉴定,房屋消防电器安全鉴定评估,火灾后房屋安全鉴定推荐这十家公司!
  • 实用指南:WSL2搭建Hadoop伪分布式环境
  • 3整数规划-分支定界法
  • [apple pencil二代充不上电]