基础的图论算法——拓扑排序,Dijkstra算法,Prim算法,Floyd算法

拓扑排序

Q:不知道你是否也曾苦恼于生物里的求食物链数目的题目。如果现在任意给你一个食物网,你能用程序来求出这个食物网中食物链的数量吗?

A:你初次看到这个题目时,也许会不知从何下手。但如果你之前对拓扑排序有所了解的话,你会发现这个题目其实很好解决。数一条食物链,往往从生产者入手,即那些只能被吃的生物,给这些生产者们每人一个初始权重1,给那些能够食用这些生产者的动物,送去他们能食用的所有植物,每食用一种,就在他们的初始权重0的基础上加上这种植物的权重。把生产者们从食物链中去掉,你会发现食物链中又多了一批只能被别人吃的可怜生物,我们可以把它们当成新的生产者,然后重复上述步骤,直到最后遍历完所有的生物。

最后把顶级消费者身上的权重加起来,你会发现这个数字恰好就是食物网中食物链的总数。再回过头去看,你会发现,我们每次只去掉那些只能被吃的生物的操作,恰恰保证了我们我们遍历了所有可能的食物链,不多也不少,倘若在某次操作中不小心去掉了某个还能吃别人的生物,我们最后得到的结果肯定会偏小。

这就是拓扑排序的思想。

把一个食物网等效成一个有向图(其实它本来就是😂),我们可以把初始入度为0的点存储在一个队列中,每次从队首弹出一个元素,把它指向的点的入度都-1,倘若减1之后该点的入度变成了0,那么我们把这个点也放进队列中,不断进行,直到最后队列为空,这就是拓扑排序。

Dijkstra算法

Dijkstra算法是一种求单源最短路径的算法

所谓求单源最短路径,就是求一个点到其他点

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值