拓扑序和图

206 阅读2分钟

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战

基本定义

图是由有穷顶点的非空集合和顶点之间的边的集合组成。 本文主要说的是有向图。

如下图就就是一个典型的图结构,但是好像解读不出什么具体关系。 下面给它赋予一个关系。 image.png

我们前端打包都需要分析依赖。假如这些顶点分别代表一个单独的模块,这些边代表依赖关系。

具体情景

也就是A模块不依赖其他模块,B模块依赖A模块, D依赖A, c依赖B D, E 依赖C。 我们需要按一定的顺序引入这些模块才能保证正常运行。 这里因为 A模块没有前置依赖,所以可以直接引入。 引入A之后,就可以引入B ,引入D, 待得B D都引入之后,c就可以引入了,最后才能引入E 。 我们的一个拓扑序就是 A-->D-->B-->C-->E;

上面引入依赖的顺序就是一个拓扑序,一般来说拓扑序可能有多种,比如上面的在引入A之后,先引入D ,还是先引入B 都行,不影响我们最终成功引入全部依赖。

这里有个概念叫做 入度。从图上看就是,有多少条边抵达这个顶点。换成我们这个例子,就是每个模块的依赖有几个。 A 的入度就是 0 ,B D E 的入度为 1, C 的入度是2.

如果把顶点看作开关, 边看作管道,那么当一个顶点的入度为0的时候,这个顶点的开关就打开了。 也许,我们倒着来看也许更容易理解,要想引入E ,就必须引入C ,要想C就得先引入B D,而要引入B D就要引入A。所以,我们最先引入A。 在A 引入之后,B D 的前置依赖就得到了满足, 此时 B D 的入度-1,入度为0 ,可以引入了。 如果后面还有更多依赖也是这样, 前置依赖满足了之后,对应顶点的入度-1, 当入度为0 时,就可以接着引入了

课程表

这道题的课程就等同于我们的模块, 引入成功=== 学习了。 每门课程的前置课程 === 模块的依赖。

关于有向图的理解就这么多。