拓扑排序
Q:不知道你是否也曾苦恼于生物里的求食物链数目的题目。如果现在任意给你一个食物网,你能用程序来求出这个食物网中食物链的数量吗?
A:你初次看到这个题目时,也许会不知从何下手。但如果你之前对拓扑排序有所了解的话,你会发现这个题目其实很好解决。数一条食物链,往往从生产者入手,即那些只能被吃的生物,给这些生产者们每人一个初始权重1,给那些能够食用这些生产者的动物,送去他们能食用的所有植物,每食用一种,就在他们的初始权重0的基础上加上这种植物的权重。把生产者们从食物链中去掉,你会发现食物链中又多了一批只能被别人吃的可怜生物,我们可以把它们当成新的生产者,然后重复上述步骤,直到最后遍历完所有的生物。
最后把顶级消费者身上的权重加起来,你会发现这个数字恰好就是食物网中食物链的总数。再回过头去看,你会发现,我们每次只去掉那些只能被吃的生物的操作,恰恰保证了我们我们遍历了所有可能的食物链,不多也不少,倘若在某次操作中不小心去掉了某个还能吃别人的生物,我们最后得到的结果肯定会偏小。
这就是拓扑排序的思想。
把一个食物网等效成一个有向图(其实它本来就是😂),我们可以把初始入度为0的点存储在一个队列中,每次从队首弹出一个元素,把它指向的点的入度都-1,倘若减1之后该点的入度变成了0,那么我们把这个点也放进队列中,不断进行,直到最后队列为空,这就是拓扑排序。
Dijkstra算法
Dijkstra算法是一种求单源最短路径的算法
所谓求单源最短路径,就是求一个点到其他点