09省赛ACM算法参考.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
09省赛邵伯仲的算法参考 1 最短路径解析(1-7页) 2 中国剩余定理 (7-11页) 3 有重复元素排列问题 (11-12) 4 欧拉回路问题 (13-16页) 5 母函数问题 (17-25页) 6 集合划分问题 (25页) 7 常系数线性递推矩阵乘法 (26-30页) 最短路径解析 最短路径(Shortest Path)是在实际应用中非常有用的工具,将该问题细分,可以分为点到点最短路径(source-sink),单源点的最短路径(single-source),所有点到所有点(all-pairs)以及带负边情况下的最短路径。 为了简化我们的问题,设置以下几个限制: 有向图,无向图可以看作每条边对应两条方向相反的有向边 无负环,可以想象,如果存在负环则路径值可不断减小,含负环的最短路径是NP的,暂不讨论。 单源点最短路径的简单算法 单源点最短路径(无负边)可以用Dijkstra算法较好的解决,其思想类似与求最小生成树(MST)的Prim算法。只是Dijkstra将优先队列的权由两点的边改为了从源点到下一点的路径: Prim : Priority= edge.weight() // 从v点到w点的weight Dijkstra: Priority= wt[v] + edge.weight() // 从源点到w点的值,wt[v]表示源点到v点的值 注意,wt保存的就是Priority。 类似于Prim,Dijkstra算法的复杂度主要取决于优先队列的实现,普通的Dijkstra算法能在线性时间内解决单源点无负边的最短路径问题,即复杂度为V2。采用了优先队列的数据结构后,可以在ElgdV - Elg2V之间解决问题(d表示采用d-堆)。 点到点的无负边最短路径也可以用Dijkstra来解决,从源点出发,当搜索到目标点时停止搜索。十分容易理解,我就不罗嗦了。 All-Pairs 的最短路径问题 正如大多数教材中所讲到的,求单源点无负边最短路径用Dijkstra,而求所有点最短路径用Floyd。确实,我们将用到Floyd算法,但是,并不是说所有情况下Floyd都是最佳选择。 对于没有学过Floyd的人来说,在掌握了Dijkstra之后遇到All-Pairs最短路径问题的第一反应可能会是:计算所有点的单源点最短路径,不就可以得到所有点的最短路径了吗。简单得描述一下算法就是执行V次Dijkstra算法,自然其复杂度在最优情况下可以是VElgdV。 Floyd可以说是Warshall算法的扩展了,三个for循环便可以解决一个复杂的问题,应该说是十分经典的。从它的三层循环可以看出,它的复杂度是V3,除了在第二层for中加点判断可以略微提高效率,几乎没有其他办法再减少它的复杂度。 比较两种算法,不难得出以下的结论:对于稀疏的图,采用V次Dijkstra比较出色,对于茂密的图,可以使用Floyd算法。另外,Floyd可以处理带负边的图。 无环网络的最短路径问题 无环网络(与DAG略微有区别)较带环网络而言,因为无环,所以边的正负是无所谓的。 记得拓扑网络中有的点可能只做源点没有入度,那么在求最短路径中就搜索不到该点了,我们提出多源点的最短路径问题(Multisource shortest paths)了描述这种情况下求最短路径。其实我们可以将该问题转化为单源点的最短路径问题,只需加一个哑结点,其指向所有的无入度结点,来作为新的源,而哑结点的所有边权为0。 在一般图(带正环)中求最长路径问题,类似在带负环图中求最短路径问题,是NP难的。不过在无环网络中却可以求最长路径,因为无环网络无正环,所以可以确定最长的路径,而且最长路径对于DAG很有意义。所以我们先考虑在DAG中求最长路径(最短路径算法类似): 利用DAG的强大武器——拓扑排序,可以避免Dijkstra中使用优先队列的损耗,因此效率高于Dijkstra。 只要按拓扑排序后的序列遍历每个结点,刷新每条边,最终就可以得到最长路径了。 求多源点的最长或最短路径问题可以在线性时间内解决,即复杂度E。 对于所有点的最短路径,我们当然可以运行V次上一段的算法来求,这样复杂度是VE。除此以外,还存在着无环图中求所有点的最短路径,而且它可以避免多次使用拓扑排序。 类似于求DAG的传递闭包问题,采用DFS和DP方法,可以得到一个有效的算法。伪代码如下: 储存边的二维数

文档评论(0)

ktj823 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档