网站大量收购闲置独家精品文档,联系QQ:2885784924

《单源最短路径.docxVIP

  1. 1、本文档共7页,可阅读全部内容。
  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文档。上传文档
查看更多
《单源最短路径

单源最短路径13计科行知班 张志超 2013020051一 问题描述给定带权有向图G=(V,E),其中每条边的的权都是非负实数。另外,还给定V中的一个顶点称为源。现在要计算源到其他所有顶点的最短路径长度,这里的路径长度指的是路上各边权之和。贪心算法 问题分析和推导过程(1)问题分析为甚想到了用贪心算法?从解决该问题的方法来看解决该问题的过程就是不断选择最优路径所需要经过的顶点,然后解决选取完相应顶点所产生的子问题的过程,这与贪心算法不谋而合,,而且此问题的解还具有贪心算法的最优子结构性质。(2)推导过程对于单元最短路径问题,在数据结构的课程中有过详细的介绍,我们知道解决此问题解决方法称为dijkstra算法,下面介绍该算法的基本思想,设置定点集合S并不断的做贪心选择来扩充这个集合。一个定点数与集合s当且仅当从源到该顶点的最短路径已知。初始时,s中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过 S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度,dijstra算法每次从V-S中取出具有最短特殊路径长度的顶点u,将u添加到s中,同时对数组dist进行必要的修改,一旦S包含了所有V的所有顶点那么S终究记录了源到其他所有顶点之间的最短路径。最优子结构性质证明欲证明最优子结构性质只要考察算法中子啊添加u到s后,dist[u]的值所起的变化。将添加u之前的S称为老S当添加了u之后,可能出现一条到达顶点i的新路径,。如果这条新路径事先经过老S到达顶点u,然后从u经一条边直接到达顶点i。则这种路的最短长度为dist[u]+a[u][i] 。这时若dist[u]+a[u][i]dist[i],则算法中用dist[u]+a[u][i]作为dist[i]的新值。若不是从u经过一条边直接到达i而是回到老S中某个顶点x,那么由于x在老S中,所以u比x早加入s所以从源到X的长度比从源点到U,再从U到X路径短,故不需考虑.所以无论dist[u]是否有变化,总是关于定点集S到顶点U的最短特殊路径长度三 算法实现Dijistra算法可描述如下。其中输入带权有向图是G=(V,E),V = {1,2,…….,n}。顶点V是源。a是一个二维数组,a[i][j]表示边(i.j)的权。当(i,j)是一个大数。Dist[i]表示当前从源到顶点i的最短特殊路径长度。Public static void dijstra(int v, float[][] a,float [] dist, int [] prev){ Int n= dist.length-1; If(v1 || vn) return ; boolean [][] s = new booolean[n+1]; for(int i = 1; in;i++){ dist[i] = a[v][i]; s[i] = false ; if(dist [j] == float.MAX_VALUE) prev[i] = 0; else prev[i] = v;}dist[v] = 0;s[v] = true;for(int I = 1; i n; i++){ Float temp = FLOAT.MAX_VALUE; Int u = v;For(int j = 1; j n; j++){ If((!s[j])(a[u][jfloatMAX_VALUE])){ float newdist = dist[u]+a[u][j]; if(newdist dist[j]) { Dist[j] = newdist; Prev[j] = u; } }}}程序全部代码如下:#include?iostream#includestack#define?M?100#define?N?100using?namespace?std;typedef?struct?node{?int?matrix[N][M];??????//邻接矩阵??int?n;?????????????????//顶点数??int?e;?????????????????//边数?}MGraph;?void?DijkstraPath(MGraph?g,int?*dist,int?*path,int?v0) 0表示源顶点?{?int?i,j,k;?bool?*visited=(bool?*)malloc(sizeof(bool)*g.n);?for(i=0;ig.n;i++)?????//初始化??{?if(g.matrix[v0][i]0i!=v0)?{?dist[i]=g.matrix[v0][i];?path[i]=v0;?????//path记录最短路径上从v0到i的前一个顶点??}?else?{?dist[i]=INT_MAX;?

文档评论(0)

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

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

1亿VIP精品文档

相关文档