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

单源最短路径_附件.ppt

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
问题描述:给定一个带权有向图 ,其中每条边的权是非负实数。给定 中的一个顶点,称为源(v)。计算从源到所有其他各顶点的最短路长度。路的长度是指路上各边全之和。 带权有向图:顶点u和v相互邻接,顶点 对 不等同于顶点对 ,边 的方向是从顶点u到顶点v,其中u成为尾,v称为头,也可以说边 离开u进入v。如果每一条边都是有向的,则图本身是有向的。给有向图的边赋了值的图称为带权有向图。 1 2 4 3 例如: 算法描述: 1)算法思想(Dijkstra):设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合为S,初始时v S,最短路长度为0,然后用贪心选择逐步扩充S。 第二组为其余未确定最短路径的顶点集合(用V-S表示),每次在V-S中,选择路径长度值最小的一条最短路径的终点u加入S中。 构造长度最短的路径:设已构造i条最短路径,那么下一个加入S的终点u肯定是V-S中具有最小路径长度的终点,其长度或者是边(v,u)的权,或者是中间只经过S中的顶点而最后到达顶点u的路径。 2)算法步骤: a.初始时,S只包含源点,即S={v},v的距离为0。V-S包含除v外的其他顶点,即:V-S={其余顶点},若v与V-S中顶点u有边,则u,v正常有权值,若u不是v的邻接点,则u,v权值为∞。用c[u][v]表示u,v的权值。 b.从V-S中选取u,使得dist[u]min{dist[i]|i V-S},把u加入S中(该选定的距离就是v到u的最短路径长度)。 c.以u为新考虑的中间点,修改V-S中各顶点的距离;若从源点v到顶点k的距离(经过顶点u)比原来距离(不经过顶点u)短,即dist[u]+c[v][u]dist[k],则修改顶点k的距离值使得dist[k]=dist[u]+c[u][k]; d.重复步骤b和c直到所有顶点都包含在S中,共n-1次。 迭代 S u dist[2] dist[3] dist[4] dist[5] 初始 {1} — 10 maxint 30 100 1 {1,2} 2 10 60 30 100 2 {1,2,4} 4 10 50 30 90 3 {1,2,4,3} 3 10 50 30 60 4 {1,2,4,3,5} 5 10 50 30 60 Dijkstra算法的迭代过程举例 1 2 4 3 5 20 100 60 10 30 50 10 带权有向图 步骤 S集合中 V-S集合中 1 选入1,此时S={1},此时最短路径为1→1=0,以1为中间点,从1开始找 V-S={2,3,4,5} 1→2=10 1→4=30 1→5=100 1→其他V-S中的顶点=∞ 1→2=10权值为最短 2 选入2,此时S={1,2} 2为中间点,从1→2这条最短路径开始找 V-S={3,4,5} 1→2→3=60 1→2→4=∞ (比第一步中30长,选择1→4=30) 1→2→5=∞(比第一步中100长,选择1→5=100) 发现1→4=30权值最短 3 选入4,此时S={1,2,4} 4为中间点,从1→4=30开始找 V-S={3,5} 1→4→3=50 1→4→5=90(比1→5=100权值短,则权值为90) 发现1→4→3=50权值最短 4 选入3,此时S={1,2,4,3} 3为中间点,从1→4→3开始找 V-S={5} 1→4→3→5=60(比1→4→5=90短,则到5的权值为90) 1→4→3→5=60权值最短 5 选入5,此时S={1,2,4,3,5} V-S集合已空,查找完毕 {    bool s[maxint];    for(int i=1; i=n; i++)    {    dist[i] = c[v][i];    s[i] = false;   if(dist[i] ==maxint)    prev[i] = 0;    else prev[i] = v;   } dist[v] = 0;  s[v] = true;   for(int i=1; in; i++) //循环要执行n-1次    {    int temp =maxint;    int u = v;      for(int j=1; j=n; j++)    if((!S[j]) dist[j]mindist)    {    u = j; temp= d

文档评论(0)

kehan123 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档