北工大(数据结构)11-DSch7Graph.ppt

  1. 1、本文档共93页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北工大(数据结构)11-DSch7Graph

* 邻接矩阵:从弧尾找弧头,需跳过0找1,效率低 邻接表:有多少条弧单链表中就有多少弧结点(有几个存储几个,不浪费),善于从弧尾找弧头 十字链表:邻接表和逆邻接表的结合,既可以从弧尾找弧头(邻接表),也可从弧头找弧尾(逆邻接表); 拓扑排序操作2)只需要找弧头,不需要找弧尾,所以冗余 选中邻接表; 由基本操作1),又需要对入度进行减1操作,需要存储每点入度,在邻接表顶点数组中增设存储入度域 * 每次改变D[i].length,可以通过先删除再重新插入的方法来改变顶点i在堆中的位置, 或者仅为某个顶点添加一个新值(更小的),作为堆中新元素(而不作删除旧值的操作,因为旧值被找到时,该顶点一定被标记为VISITED,从而被忽略)。 不作删除旧值的缺点是,在最差情况下,它将使堆中元素数目由Θ(|V|)增加到Θ(|E|),此时总的时间代价为Θ((|V|+|E|)log|E|),因为处理每条边时都必须对堆进行一次重排。 7.5.2 每对顶点间的最短路径 Floyd算法 Floyd算法思想: 假设用相邻矩阵adj表示图 Floyd算法递归地产生一个矩阵序列adj(0),adj(1),…, adj(k) ,…, adj(n) adj(k)[i,j]等于从顶点Vi到顶点Vj中间顶点序号不大于k的最短路径长度 假设已求得矩阵adj(k-1),那么从顶点Vi到顶点Vj中间顶点的序号不大于k的最短路径有两种情况: 一种是中间不经过顶点Vk,此时adj(k)[i,j]=adj(k-1)[i,j] 另一种是中间经过顶点Vk,此时adj(k)[i,j]adj(k-1)[i,j], adj(k)[ i,j]= min{adj(k-1)[ i,j], adj(k-1)[ i,k]+ adj(k-1)[ k,j]} 7.5.2 每对顶点间的最短路径 V0 V1 V2 5 2 8 3 adj0 0 ∞ 2 5 0 8 ∞ 3 0 adj1 0 ∞ 2 5 0 7 ∞ 3 0 adj2 0 ∞ 2 5 0 7 8 3 0 adj3 0 5 2 5 0 7 8 3 0 path 0 -1 0 1 1 1 -1 2 2 path 0 -1 0 1 1 0 -1 2 2 path 0 -1 0 1 1 0 1 2 2 path 0 2 0 1 1 0 1 2 2 途经v0只看[1,2][2,1] D[1,2]D[1,0]+D[0,2] D[2,1]D[2,0]+D[0,1] 途经v1只看[0,2][2,0] D[0,2]D[0,1]+D[1,2] D[2,0]D[2,1]+D[1,0] 途经v2只看[0,1][1,0] D[0,1]D[0,2]+D[2,1] D[1,0]D[1,2]+D[2,0] path[0]=0 path[1]=1 path[2]=2 if D[ij]=∞ path[ij]=-1 7.5.2 每对顶点间的最短路径 途经v1只看[2,3][3,2] D[2,3]D[2,1]+D[1,3] D[3,2]D[3,1]+D[1,2] 途经v2只看[1,3][3,1] D[1,3]D[1,2]+D[2,3] D[3,1]D[3,2]+D[2,1] 途经v3只看[1,2][2,1] D[1,2]D[1,3]+D[3,2] D[2,1]D[2,3]+D[3,1] 7.5.2 每对顶点间的最短路径[算法7.9] void Floyd(Graph G, Dist** D){ 1/2 int i, j, v; //i,j,v作为计数器 D=new Dist*[G.VerticesNum( )]; //创建D[ ][ ] for(i=0; ;iG.VerticesNum();i++) { D[i]=new Dist[G.VerticesNum()]; } for(i=0;iG.VerticesNum( );i++) //初始化D数组 for(j=0;jG.VerticesNum( );j++) if(i==j){ D[i][j].length=0; D[i][j].pre=i; }//对角线0 else{D[i][j].length =INFINITY; D[i][j].pre=-1;}//无路 for(v=0;vG.VerticesNum();v++) for(Edge e=G.FirstEdge(v);G.IsEdge(e);e=G.NextEdge(e)){ D[v][G.ToVertex(e)].length=G.Weight(e); //按权初始D

文档评论(0)

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

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

1亿VIP精品文档

相关文档