2018.2.10 dijkstra's shortest path

内容比较少,一个week就讲了一个dijkstra,assignment也不难,就实现dijkstra而已,然而比较难的是用heap来实现O(n*logm)的dijkstra,这个我自然是没做的。。。

主要是急着做完,明晚跟zzg吃完饭回来可以考虑把implemented的版本给实现出来。

这个算法内容基本是一目了然的,写出来也很短小。对于给定的有向有权图,对于给定起点,求到任意结点的最小路径。之前的BFS也可以求最小路径,但那是无权图。算法的过程就是把所有结点分为两大阵营:已完成结点和未完成结点。或者说我方和敌方。那么整个算法就是一个巨大的while循环,不停的在寻找如下的边,即:尾结点在我方,头结点在敌方,这样的跨阵营边的长度,加上尾结点到起点的长度,如果某个边的这个值是当前所有这样的边中最小的,就把这个边的头结点招进我方阵营,然后重复while循环,直到敌方阵营结点全都没有了为止。

这个算法是O(mn)的,while循环是n,找边的模块需要nested循环所以乍一看挺吓人,但仔细一想发现其实就是m的。算法本身的证明也挺简单,而且其实也不怎么用看证明,因为非常直观,很好理解。

但是实现的难点其实在于用heap数据结构储存跨阵营的边的权值来把m优化成log(m),这一部分的算法我没去实现,应该是更麻烦一些的。

明晚看看是实现这个还是去做PL。

转载于:https://www.cnblogs.com/dynasty919/p/8440365.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值