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

day4_图论算法与模型构建.ppt

  1. 1、本文档共111页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法说明: Bellman-ford算法N次迭代就可以判断图中是否有“负环”。 取所有边有两种方法: (1)扫描每一点的邻接链表 (2)用有序点对(x,y)记录边时,可直接取边。但要请注意对无向图,要注意(y,x)也要松驰。 对于求s到某点t的最短距离,可能因为其它地方有“负环”而出现问题,要预处理。 最短路径-----Bellman-ford算法 算法描述4: SP_Bellman(G, s) //求单源s到其它点的最短距离 for i=1 to n do dis[i] ? ∞ // 初始化每点到s距离 dis[s] ? 0 //将dis[s]设为0 for i=1 to n do //最多迭代n rel=false; //是否有松驰标志 for 每条边(x,y) //取图的每一条边 if( dis[x]+len[x][y]dis[y]) //不满足三角形性质 dis[y]=dis[x]+len[x][y]; //松驰dis[y] rel=true; if rel = false return 0; //没有一次松驰,则结束 return -1; //迭代了n次,有负圈 最短路径----- Bellman-ford算法 对迭代的改进:SPFA算法 Bellman-ford算法中,每次都要检查所有的边。这个看起来比较浪费,对于边(x,y),如果上一次dis[x]没有改变,则本次的检查显然是多余的。 我们每次只要从上次刚被“松驰”过的点x,来看看x能不能松驰其它点即可。 SPFA算法中用BFS中的队列来存放刚被“松驰”过的点。由于顶点个数为|V|,队列如果用数组的话显然要用“循环队列”使用空间。 最短路径-----SPFA算法 算法描述:SP_SPFA(G, s) //求单源s到其它点的最短距离 for i=1 to n do dis[i] ? ∞;vis[i] ? false; // 初始化每点到s距离,不在队列 dis[s] ? 0; //将dis[s]设为0 vis[s] ? true; count ? 1; //s放入队列 head ? 0; tail ? 0; q[0]=s; //队列头尾指针 while (count0) do v ? q[head]; //队头节点v for 每条边(v,i) //与v相连的每一条边 if( dis[v]+len[v][i]dis[i]) //不满足三角形性质 dis[i] ? dis[v]+len[v][i]; //松驰dis[i] if (vis[i] = false) //不在队列,则加入队列 vis[i] ? true; count+1; tail+1; q[tail] = i; vis[v] ?false;head+1;count-1; //v出队列 最短路径----- SPFA算法 求每对节点之间最短距离问题:例如,求一个图的直径,即所有最短路径中最长的。 如果多次调用单源最短路径算法,效果并不好。特别是对有负边的图。 如果无负环,则有简单的Floyd-warshell算法。这是动态规划算法。 最短路径-----Floyd算法 动态规划算法 定义d[ i ,j , k ]为 路径中间只允许经过节点1…k的情况下 i到j的最短路距离 它有两种情况 最短路经过点k,d[i,j,k]=d[i,k,k-1]+d[k,j,k-1] 最短路不经过点k,d[i,j,

文档评论(0)

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

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

1亿VIP精品文档

相关文档