单源i最短路径.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文档。上传文档
查看更多
实验1. 贪心法求解单源最短路径问题 一 实验内容 本实验要求基于算法设计与分析的一般过程(即待求解问题的描述、算法设计、算法描述、算法正确性证明、算法分析、算法实现与测试)。应用贪心策略求解有向带权图的单源最短路径问题。 二 实验目的 通过本次实验,掌握算法设计与分析的一般过程,以及每个步骤的基本方法。并应用贪心法求解单源最短路径问题。 三 环境要求 对于环境没有特别要求。对于算法实现,可以自由选择C, C++, Java,甚至于其他程序设计语言。 四 问题描述 长度两个结点u和v之间的最短带权路径长度(u, v): 单源最短路径问题要求:计算源点s到其他各个结点v的最短路径(及其)长度δ(s, v)。 五 算法思想(Dijkstra) (1)按各个结点与源点之间路径长度的非减次序,生成源点到各个结点的最短路径的方法。 (2)即先求出长度最短的一条路径,再参照它求出长度次短的一条路径。依此类推,直到从源点到其它各结点的最短路径全部求出为止。 六 算法设计 (1)集合S与V-S的划分:假定源点为u。集合S中的结点到源点的最短路径的长度已经确定,集合V-S中所包含的结点到源点的最短路径的长度待定。 (2)特殊路径:从源点出发只经过S中的结点到达V-S中的结点的路径。 (3)贪心策略:选择特殊路径长度最短的路径,将其相连的V-S中的结点加入到集合S中。 求解步骤: 步骤1:设计合理的数据结构。设置带权邻接矩阵C,记录结点之间的权值;dist[]记录顶点与源点u的最短路径长度;p[]记录顶点到源点的最短路径上的该顶点的前驱顶点。 步骤2:初始化。令集合S={u},对于集合V-S中的所有顶点x,设置dist[x]=C[u][x];如果顶点i与源点相邻,设置p[i]=u,否则p[i]= -1。 步骤3: 在集合V-S中依照贪心策略来寻找使得dist[x]具有最小值的顶点t,t就是集合V-S中距离源点u最近的顶点。 步骤4: 将顶点t加入集合S中,同时更新集合V-S; 步骤5: 如果集合V-S为空,算法结束。否则,转步骤6; 步骤6: 对集合V-S中的所有与顶点t相邻的顶点x,如dist[x]dist[t]+C[t][x],则dist[x]=dist[t]+C[t][x]并设置p[x]=t。转步骤3. 七 算法描述 Void dijkstra(int n, int u, double dist[], int p[], double c[][]) { 初始化数组dist[]、p[]和s[]; for (0 to n) { 在dist[n]中求最小值,并将其对应的结t点加入到S[]中; 更新与t相邻的顶点到源点u的距离最短路径的最优子结构性质?该性质描述为:如果P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,k和s是这条路径上的一个中间顶点,那么P(k,s)必定是从k到s的最短路径。?? 假设P(i,j)={Vi....Vk..Vs...Vj}是从顶点i到j的最短路径,则有P(i,j)=P(i,k)+P(k,s)+P(s,j)。而P(k,s)不是从k到s的最短距离,那么必定存在另一条从k到s的最短路径P(k,s),那么P(i,j)=P(i,k)+P(k,s)+P(s,j)P(i,j)。则与P(i,j)是从i到j的最短路径相矛盾。因此该性质得证。 S={s, p1, …, pk}时,即k个结点p1, …, pk到源点s的距离最短。当S={s, p1, …, pk, pk+1}时,很显然结点pk+1到源点s的距离是最短的。需证明:此时结点p1, …, pk到源点s的距离仍然是最短的。用反证法假设当结点pk+1加入到S后,pi结点经由结点pk+1到源点s的距离更短,即d(s, pk+1) + d(pk+1, pi) d(s, pi),有d(s, pk+1) d(s, pi) ,则结点pk+1应比pi早被选择到S中,与假设相矛盾。证毕。 九 算法分析 (1)时间复杂性 算法中二层循环的时间复杂性为O(n2),另一个循环为O(n),所以T O(n2) ()空间复杂性public class Dijkstra { private static final double Max = Math.exp(4000.0);// 自定义一个无穷大 public static void dijkstra(int n, int u, double dist[], int p[], double c[][]) { boolean s[] = new boolean[n]; //初始化p[i] for (int i = 0; i n; i++)

文档评论(0)

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

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

1亿VIP精品文档

相关文档