动态规划所有点的对最短距离.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文档。上传文档
查看更多
动态规划所有点的对最短距离

第七章动态规划;7.5所有点对的最短路径问题;复习Dijkstra算法;算法中,我们不断更新以下三个数组: s数组: s[i],当顶点i加入S时,s[i]置1 Distance数组: Distance[i]记录原点到 顶点i的最短特殊路径长度。 path数组: path[i]记录顶点i在其最短特殊路径上的前驱顶点。由该数组可求得原点到各点的最短路径。如:设源点是顶点1, path数组如下 ; 例如,对右图中的有向图,应用Dijkstra算法计算从源顶点1到其它顶点间最短路径的过程列在下页的表中。;方法一:重复调用Dijkstra算法n次;voidShortPath(AdjMWGraph G, int **distance, int **path) { Int n=G.NumOfVertices(); for(inti=0;in;i++) Dijkstra(G,i,distance[i],path[i]); };该问题具有最优子结构性质;子问题的构造;子问题Dk:从顶点i(可以经过顶点1、顶点2、……顶点k,不得经过任何其他顶点)到顶点j的距离。 子问题Dn:从顶点i(可以经过顶点1、顶点2、……顶点n )到顶点j的距离。 ——即原问题 ;递推关系的建立;例:考虑下图所示的带权有向图,求所有顶点之间的最短距离。;1;算法设计;FLOYD算法;练习;选做题;4 单源最短路径;8.3 单源最短路径;Dijkstra算法的选择策略;8.3 单源最短路径; 初始状态下,S中只有一个点(源点v1)。; 第二步,将S外距离S最近的点v2加入S。更新相应信息。; 第三步,将S外距离S最近的点v4加入S。更新相应信息。 ; 第四步,将S外距离S最近的点v3加入S。更新相应信息。 ; 第五步,将S外距离S最近的点v5加入S。更新相应信息。 ;void Dijkstra ( int G[][N],int v0,int dist[], int path[],int n) //源点v0到其他顶点的最短距离dist和最短路径下标path { int *s=new int[n]; int minDis, i, j, u; ? //初始化三个数组 ;//逐次将各点加入S //在当前还未找到最短路径的顶点集中 选取具有最短距离的顶点u //标记顶点u已从集合T加入到集合S中 //修改从v0到其他顶点的最短距离和最短路径 ;void Dijkstra ( int G[][N],int v0,int dist[], int path[],int n) //从源点v0到其他顶点的最短距离dist和最短路径下标path {int *s=new int[n]; int minDis , i, j, u; ? //初始化三个数组 for(i=0;in;i++) {;dist[i]=G[v0][i]; s[i]=0; if(I != v0 dist[i]MAX) path[i]=v0; else path[i]=-1; } s[v0]=1;//标记顶点v0已从集合T加入到集合S中 //在当前还未找到最短路径的顶点集中选取具有最短距离的顶点u for(i=1;in;i++) {minDis=MAX; for(j=0;j=n;j++);u到j有边相连,j才有可能因u的加入而距离源点更近;dist[j]=dist[u]+G[u][j]; path[j]=u; }}} ;拦截导弹 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭。由于该系统还在试用阶段,所以只有一套系统,因此有可能不能拦截所有的导弹。 输入导弹依次飞来的高度(雷达给出的高度数据是不大于30000的正整数),计算这套系统最多能拦截多少导弹. 样例: INPUT OUTPUT 389 207 155 300 299 170 158 65 6(最多能拦截的导弹数)

文档评论(0)

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

分享好文档!

1亿VIP精品文档

相关文档