- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
* 其余最短路径的特点: 1)、直接从源点到 vi v0, vi (只含一条弧); 2)、从源点经过已求得的最短路径上的顶点,再到达 vi (含有多条弧)。 f b g e d c a 8 5 6 2 30 20 7 17 32 9 * Dijkstra 算法步骤: T 中顶点对应的距离值用辅助数组 D 存放。 D[i] 初值:若 v0, vi 存在,则为其权值;否则为∞。 终点 从 v0 到各终点的最短路径及长度 i =1 i =2 i =3 i =4 i =5 i =6 v1 v2 v3 v4 v5 v6 vj S v5 v1 v6 v4 v3 v2 v0 8 5 6 2 30 13 7 17 32 9 v2 13 8 ∞ 30 ∞ 32 v2 8 13 13 30 ∞ 32 v3 v1 v1 13 13 30 22 20 v3 8+5 19 22 20 v4 v4 8+5+6 21 20 v6 v5 13+7 21 v5 v6 初始时令 S={v0}, T={其余顶点}。 v0 从 T 中选取一个其距离值最小的顶点 vj,加入 S。 对 T 中顶点的距离值进行修改:若加进 vj 作中间顶点,从 v0 到 vi 的距离值比 不加 vj 的路径要短,则修改此距离值。 重复上述步骤,直到 S = V 为止。 8+5 +6+2 ▲ * 设V0是源点,S是已求得最短路径的终点集合,则V-S是未确定最短路径的顶点的集合。初始时 S ={V0},设D[i]用于保存从源点出发到达顶点Vi的最短路径。 初始时,若源点到顶点Vi有边,则D[i]为边上的权值;否则, D[i]为∞。 从V0出发,长度最短的最短路径是(V0 ,Vj),即D[j]=min{D[i]|Vi∈ V-S} 将顶点Vj加入S集合,同时将其从集合V-S中去掉; 求下一条长度最短的路径: 修改从V0出发到达集合V-S中所有顶点的最短路径的长度,即 如果D[j]+arcs[j][k]D[k] (Vk∈ V-S),则修改D[k]为D[j]+arcs[j][k] 上述最短路径中长度最小者即为下一条长度最短的路径,即 D[j]=min{D[i]|Vi∈ V-S} 将顶点Vj加入S集合,同时将其从集合V-S中去掉; 重复2)直到求出所有顶点的最短路径。 迪杰斯特拉算法(Dijkstra) * final[]表示某顶点是否在集合S中: final[i]=true,顶点i在集合S中 final[i]=false,顶点i不在集合S中 P[ ][ ]表示路径: P[v][w]=true,w是从源点到顶点v最短路径上的顶点 P[v][w]=false,w不是从源点到顶点v最短路径上的顶点 for(v=0;vG.vexnum;v++) { //初始化 final[v] = false; D[v] = G.arcs[v0][v]; for(w=0;wG.vexnum;++w) P[v][w] = false; if (D[v]INFINITY) { P[v][v0] = true; P[v][v] = true; }//if }//for 20 V4 V5 V0 V2 V3 V1 100 10 5 60 10 50 30 迪杰斯特拉算法(Dijkstra) * D[v0] = 0; final[v0] = true; //集合S置初值 for(i=1; vG.vexnum; i++) { //求其余顶点的最短路径 min = INFINITY; for(w=0; wG.vexnum; ++w) { if (final[w]==false) //顶点w不在集合S中 if (D[w]min) { v = w; min = D[w]; } //顶点w离顶点v0更近 final[v] = true; //离顶点v0最近的v加入集合S ...... //更新其余顶点的最短路径; }//for 20 V4 V5 V0 V2 V3 V1 100 10 5 60 10 50 30 迪杰斯特拉算法(Dijkstra) * 迪杰斯特拉算法 D[v0] = 0; final[v0] = true; //集合S置初值 for(i=1; vG.vexnum; i++) { //求其余顶点的最短路径
文档评论(0)