图论练习.pptVIP

  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文档。上传文档
查看更多
图论练习.ppt

图论算法练习 相信数据结构、算法和CODE的力量! 主要涉及内容 堆(heap)、Dijstra-heap、spfa 并查集、 Kruskal 网络流:最大流、最小费用流 二部图:最大匹配、最大权匹配 Dijstra过程 初始化: S ← { v0 };dist[j] ← Edge[0][j], j = 1, 2, …, n-1; 1、求出最短路径的长度: dist[k] ← min{ dist[i] }, i ? V- S ; S ← S U { k }; 2、 修改: dist[i] ←min{ dist[i], dist[k] + Edge[k][i] }, for i?V- S ; 3、 判断: 若S = V, 则算法结束,否则转1。 引入一个辅助数组dist。dist[i]表示当前从源点v0到终点vi 的最短路径的长度。时间复杂度:O(V2) Dijstra-heap 在1过程中用堆(heap)来实现选择最短路径。复杂度为O(lgn) 在结点比较多的情况下,用邻接矩阵来记录图是不可能的,这种情况下要用邻接表来记录。 在一般的图中,特别是稀疏图中,每个结点的邻接顶点的个数是有限的,所以2过程的复杂度也视为O(1) 所以这样实现最短路复杂度近似认为是O(nlgn)的,在结点多的稀疏图中用起来比较高效。 堆(heap) 堆的定义 n个元素的序列 k1, k2 ,…… ,kn ,当且仅当满足以下关系时,称之为堆: ki = k2i ki = k2i ki= k2i+1 ki = k2i+1 且分别称之为小顶堆和大顶堆。 联想到二叉树,若将此元素序列按顺序组成一棵完全二叉树,则小顶堆的所有根结点值小于或等于左右孩子的值,大顶堆二叉树的所有根结点值大于或等于左右孩子的值。即堆顶元素是序列的最值。 堆排序:将无序序列建成一个堆,得到关键字最小(或最大)的记录;输出堆顶的最小(大)值后,使剩余的n-1个元素重又建成一个堆,则可得到n个元素的次小值;重复执行,得到一个有序序列,这个过程叫堆排序。 堆支持的两个操作: ①由一个无序序列建成一个大顶堆 Build-Max-Heap ②确保一个堆是一个大顶堆MAX-Heapify 堆排序的方法:Build-Max-Heap ; 将根与堆中的最后一个元素交换,堆元素个数减1,并且执行MAX-Heapify,重复此操作直到堆只剩一个元素;这样就得到了一个有序序列。 HEPASORT ? 要实现从小到大排列建立大顶堆,要实现从大到小排列建立健小顶堆 ? 运行时间: MAX-HEAPIFY复杂度O(lgn),BUILD-MAX-HEAP 的时间复杂度为O(nlgn),所以HEAPSORT的时间复杂度为O(nlgn) ? 堆排序是不稳定排序,所以实际上的运行时间可能并不是O(nlgn) 例 对下面堆进行排序 例 对下面堆进行排序 Spfa算法 算法流程 SPFA算法是Bellman-ford的一个队列优化,初始时将源点加入队列,每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。直到队列为空时算法结束。若一个点入队次数超过n,则有负权环。 我们都知道Dijstra不能解决负权边的图,如下,但spfa可以,而且算法的复杂度一般为O(kn) 练习 Pku 3159(示例) Pku 1062 Pku 2253 Zju 1589 Zju 1952 Kruskal 算法 将图中所有边按权值从小到大排序; 取权值最小的边,加入图中,判断是否形成了回路,若无,则保留此边,否则去掉该边,重取权值较小的边; 反复过程 2,直到全部顶点均连通为止。 算法复杂性O(e*loge) Kruscal算法的数据结构 一维数组,将所有边按从大到小的顺序存在数组里面 并查集 并查集 ?先把每一个对象看作是一个单元素集合,然后按一定顺序将相关联的元素所在的集合合并。能够完成这种功能的集合就是并查集。 ?对于并查集来说,每个集合用一棵树表示。 ?它支持以下操作: Union (Root1, Root2) //合并两个集合; Find(x) //搜索操作(搜索编号为x所在树的根)。 ?树的每一个结点有一个指向其父结点的指针。 练习 Pku1861(示例) Pku1258 Pku1639 zju1718 网络与流 求最大流的上些算法 Ford-Fulkerson算法(示例) Edmonds-Karp算法(示例

文档评论(0)

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

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

1亿VIP精品文档

相关文档