拓扑排序和最短路径.pptVIP

  1. 1、本文档共48页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
拓扑排序和最短路径

拓扑排序 拓扑排序 拓扑排序 拓扑排序 单源点的最短路径 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法 Dijkstra算法实现 Dijkstra算法实现 Dijkstra算法实现 路径的形式一定为: V0-Vi1-Vi2…-Vip-Vk Vi1,Vi2 ……,Vip ∈ S V0到Vk的最短路径是V0到Vip的最短路径 + Vip到Vk的边 Dijkstra算法-证明 如何找到Vk? min( D[i] + dur(i,k)) i = 0,1,…k-1 Vk?S Dijkstra算法-证明 为了减少计算量,改变一下计算次序 初始时: D[k] = 源点到顶点k 的弧上的权值 当S = S ∪{Vj},修改 D[K] = min(D[k], D[Vj] + Vj, K) Dijkstra算法-证明 templateclass T void AdjacencyWDigraphT::ShortestPaths(int s, T d[], int p[]) {// Shortest paths from vertex s, return shortest // distances in d and predecessor info in p. if (s 1 || s n) throw OutOfBounds(); Chainint L; // list of reachable vertices for // which paths have yet to be found ChainIteratorint I; // initialize d, p, and L for (int i = 1; i = n; i++){ d[i] = a[s][i]; if (d[i] == NoEdge) p[i] = 0; else {p[i] = s; L.Insert(0,i);} } // update d and p while (!L.IsEmpty()) {// more paths exist // find vertex *v in L with least d int *v = I.Initialize(L); int *w = I.Next(); while (w) { if (d[*w] d[*v]) v = w; w = I.Next();} // next shortest path is to vertex *v // delete from L and update d int i = *v; L.Delete(*v); for (int j = 1; j = n; j++) { if (a[i][j] != NoEdge (!p[j] || d[j] d[i] + a[i][j])) { // d[j] decreases d[j] = d[i] + a[i][j]; // add j to L if not already in L if (!p[j]) L.Insert(0,j); p[j] = i;} } } } 2、权值要为正数,否则,得不到正确结果 1、算法的总的时间复杂度:O(n2) 3、当权值出现负数时,要使用Bellman-Flord算法 每一对顶点之间的最短路径 v0 v2 v1 3 2 6 4 11 c a b 问题:给定一个图G,求出G中任意两个顶点之间的最短路径(距离和经过的顶点) 解决方法: 对图中的每个结点V,以V为源点,调用Dijkstra算法 时间复杂度为O(n3) 显然,顶点vi和vj之间的最短路径通过了n个顶点的某些顶点。 Floyd 算法 首先对顶点进行编号,n个顶点对应1……n个整数,分别叫做V1,V2,……,Vn 一、定义 由集合上的一个偏序关系得到集合的全序关系的操作 偏序:自反的、反对称的、传递的 全序:R是集合X上的偏序,对于集合X中的任何元素x,y,如果都

文档评论(0)

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

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

1亿VIP精品文档

相关文档