- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
图论与最短路概述
Dijkstra算法例子 以图7.13所示的图为例来说明当指定以V7为源点V0后,用Dijkstra算法求最短路径的动态执行情况,其表示集合的数组S和表示距离的数组dist元素值的变化如图7.14所示。 图7.14 算法动态执行情况 返回 练习:money 在n个人中,某些人的银行账号之间可以互相转账。这些人之间转账的手续费各不相同。给定这些人之间转账时需要从转账金额里扣除百分之几的手续费,请问A最少需要多少钱使得转账后B收到100元。 输入数据 第一行输入两个正整数n,m,分别表示总人数和可以互相转账的人的对数。 以下m行每行输入三个正整数x,y,z,表示标号为x的人和标号为y的人之间互相转账需要扣除z%的手续费 (z100)。 最后一行输入两个正整数A,B。数据保证A与B之间可以直接或间接地转账。 输出数据 输出A使得B到账100元最少需要的总费用。精确到小数点后8位。 练习:money 输入样例 3 3 1 2 1 2 3 2 1 3 3 1 3 输出样例 103时间限制: 各测试点1秒 内存限制: 你的程序将被分配40MB的运行空间 数据规模: 1=n=2000 Bellman-ford 算法 算法简单介绍 这个算法能在更一般的情况下解决最短路的问题。何谓一般,一般在该算法下边的权值可以为负,可以运用该算法求有向图的单元最长路径或者最短路径。 适用条件: 任意边权为实数的图 Bellman-Ford算法 Bellman-Ford算法的思想基于以下事实:“两点间如果有最短路,那么每个结点最多经过一次。也就是说,这条路不超过n-1条边。”(如果一个结点经过了两次,那么我们走了一个圈。如果这个圈的权为正,显然不划算;如果是负圈,那么最短路不存在;如果是零圈,去掉不影响最优值) Bellman-Ford算法的运行时间为O(VE)。很多时候,我们的算法并不需要运行|V|-1次就能得到最优值。对于一次完整的第3-4行操作,要是一个结点的最短路径估计值也没能更新,就可以退出了。 经过优化后,对于多数情况而言,程序的实际运行效率将远离O(VE)而变为O(kE),其中k是一个比|V|小很多的数。 算法简单介绍 Bellman ford 类似于Dijkstra算法,对每一个节点v,逐步减小从起点s到终点v最短路的估计量dist[v]直到其达到真正的最短路径值mindist[v]。Bellman-ford算法同时返回一个布尔值,如果不存在从源结点可达的负权回路,算法返回布尔值TRUE,反之返回FALSE。 算法具体流程 枚举每条边(u,v) ∈E(G)。 对枚举到的边进行一次松弛操作。 回到步骤1,此过程重复n-1次,以确定没有可以更优化的情况。 枚举每条边(u,v)若仍然存在可以更新的边,则说明有向图中出现了负权回路,于是返回布尔值FALSE。否则返回布尔值TRUE。 void Bellman_ford (void) { int i, j, k; for(i=1; i=C; i++)Dist[i] = INF ; Dist[S] = 0 ; for(i=1; i=C-1; i++) { for(j=1; j=C; j++) for(k=1; k=C; k++) if(Dist[k]Dist[j]+Graph[j][k])Dist[k]=Dist[j]+Graph[j][k]; } for(j=1; j=C; j++) for(k=1; k=C; k++) if(Dist[k]Dist[j]+Graph[j][k]){ printf(-1); return; } return ; } ....... A1 T An S 但松弛操作直接得出的Bellman-Ford算法效率低下 For Time=1 to N-1 For (u,v)∈E Relax(u,v) 上图数据中,总运算量高达N^2 而边(S, A1)虽然被调用N次。 但实际有用的只有一次 香甜的黄油 ??农夫John发现做出全威斯康辛州最甜的黄油的方法:糖。把糖放在一片牧场上,他知道N(1=N=500)
文档评论(0)