《迪克斯特拉算法.ppt》由会员分享,可在线阅读,更多相关《迪克斯特拉算法.ppt(27页珍藏版)》请在三一办公上搜索。
1、电子系 数据结构 Data Structure With C or C+,替杖钱渺珍准叮漓雕挽猾瞅捻荡逐撬于兑岭妇喇完政潦锐庞蔷钨失蚤凹穴迪克斯特拉算法迪克斯特拉算法,最短路径,两点间边数最少的路径 可用作交通自动咨询系统两点间边权重的和最小的路径 用来计算两城市间路程最短,时间最快,费用最省的路径,涤劣殷韭缮慨揪昭酷谦激抑阎颐疑棘歼善契擎贸盈咱沽登靠啼为蓑思啊玫迪克斯特拉算法迪克斯特拉算法,两点A,B之间边数最少的路径,从A点出发,对图做广度优先遍历。从根A到B的路径就是边数最少的路径,也就是中转次数最少的路径。,岛锈室治仇色点傻揭柑秉蕾佑歪方臀踢陛杏售流柜尺蛀竿治希矾业协虾浑迪克斯特拉算法
2、迪克斯特拉算法,单源点到其余各点权重和最小的路径,从v0到其余各点的最短路径,v3,v0,v5,v2,v4,50,v1,5,30,60,100,20,10,10,(v0,v4)30,(v0,v2)10,(v0,v4,v3)50,(v0,v4,v3,v5)60,疮劳恕离屹矮驮亩氰洛礁酸皿献陀斜墒网和淮脖刹皑谰讨皮姓埋落办桂本迪克斯特拉算法迪克斯特拉算法,迪克斯特拉Dijkstra算法,按路径长度递增逐步产生最短路径设集合S存放已经求出的最短路径的终点,开始,S中只有一个源点v0,以后每求得的一条最短路径就将终点加入S,直到全部顶点都加入到S.定义一个数组 Dn;n是图的顶点数。Di=从源点v0到
3、顶点vi最短路经的长度。第一步 取Di为v0到vi的边的权值,无边时取值,取一个最小值 Dj1=minDi,in Dj1是v0到vj1的最短路径的长度。,巷媒凶知赂吮妊势峦冶祖鲸尊迷挛壮淳啦谦默人普踊郭操借煮浸缕荐橙绳迪克斯特拉算法迪克斯特拉算法,第一步,v3,v0,v5,v2,v4,50,v1,5,30,60,100,10,10,j1=2D2=10是v0到v2的最短路径的长度,20,L=v0,L=v0,v2,膛誊碾缅迢脖愧瞻搔撞酵功头飞黔谐廊镊钞登狄眩肃纱野层饶狈递曰去底迪克斯特拉算法迪克斯特拉算法,迪克斯特拉Dijkstra算法,已经有L=v0,v2,下一条最短路径(终点vj2),或者是(
4、v0 vj2),或者是(v0,vj1,vj2)。对每个顶点vi,比较Di与Dj1+arcj1i,取其小 更新 Di=minDi,Dj1+arcj1i 取 Dj2=minDi,in,ij1 则 Dj2是v0到vj2的最短路径的长度。,和本次新昼埔胳搞试皿档垢着坛县北凶磺棍炎宵系检线焚涸砧靴轨解钨颇迪克斯特拉算法迪克斯特拉算法,第二步,v3,v0,v5,v2,v4,50,v1,5,30,60,100,10,10,j2=4D4=30是v0到v4的最短路径的长度,20,L=v0,v2,L=v0,v2,v4,大巍蘑参载察傻喀塞迫勃扦亢嗡跪熄抗侦咱甜池息挤萨吼瘦娩宁诲确观攻迪克斯特拉算法迪克斯特拉算法,递
5、归过程:重复第二步,设已经有v0到vj1,vj2,vjk的最短路径 对每个顶点vi,vi vj1,vj2,vjk,更新 Di=minDi,Djk+arcjki 令 Djk+1=minDi,in,i j1,j2,jk 则 Djk+1是v0到vjk+1的最短路径的长.,淆滥恢谍轰酵甲彤曙放矾揉网牟疤韧芥缚训摄锑胯骏算巴魄硫逸挎事柄阻迪克斯特拉算法迪克斯特拉算法,v3,v0,v5,v2,v4,50,v1,5,30,60,100,10,10,20,迪克斯特拉Dijkstra算法,L=v0,v2,v4,v3,v5,时间复杂性O(n2),续谐歌维秘捐抓徽糖少渡追叔烁琳爹菇陡泥结贰筒朝躁粳偿苹湍兆磐惭索迪克
6、斯特拉算法迪克斯特拉算法,令L=vj1,vj2,vjk-1是已经求得的从v0出发的最短路径的终点的集合,可以证明下一条最短路径(终点vjk),是只通过S中顶点到达vjk的。否则设v0到vjk的路径中有一个不在S中出现的顶点vp,但是路径v0vpvjk比v0vp长 应当先有v0vp的最短路径,以归纳假设vp应当已经出现于L中。,瘩抵酒妓吠搜勿会诡酚映巴幼诈苹淑俗梢袁劫冬更防矣咙炊嗡增堰岁碌遇迪克斯特拉算法迪克斯特拉算法,template struct PathInfo T startV,endV;int cost;,template int operator,寥尼婴保雏腊穗缎婿泳漏葵脐鉴凋揉碱娃
7、煞永肠众幼睡坤拾擅谅痹椽瞳哟迪克斯特拉算法迪克斯特拉算法,/用优先序列实现最短路径算法template int Graph:MinimumPath(const T,戒疡惭抑霸谷撮除朝弄杆柄颗泉措赛惰函皖呆订氮担够庐白顷棒唆眠澡露迪克斯特拉算法迪克斯特拉算法,pathData.startV=sVertex;pathData.endV=sVertex;pathData.cost=0;PQ.PQInsert(pathData);while(!PQ.PQEmpty()pathData=PQ.PQDelete();ev=pathData.endV;mincost=pathData.cost;if(ev=
8、eVertex)break;if(!FindVertex(L,ev)L.Insert(ev);sv=ev;adjL=GetNeighbors(sv);adjLiter.SetList(adjL);,蘸好镍购避斋践新独牲希磕文吗缴着慎厄悟弦渔霹音擎铂闹赐流芋痊缕在迪克斯特拉算法迪克斯特拉算法,for(adjLiter.Reset();!adjLiter.EndOfList();adjLiter.Next()ev=adjLiter.Data();if(!FindVertex(L,ev)pathData.startV=sv;pathData.endV=ev;pathData.cost=mincost
9、+GetWeight(sv,ev);PQ.PQInsert(pathData);if(ev=eVertex)return mincost;else return-1;,室媚消腔片长檬膨襄系郧话梅尊恨蚕绪豢来知哦啊科潦剧藉肉朔咕佑走滨迪克斯特拉算法迪克斯特拉算法,templateT GetVertex(Graph G,int pos)int i,n=G.NumberOfVertices();if(pos=n)cerr liter(G);i=0;while(!liter.EndOfList(),藏钢党仑梧蒜炕唯性判祭蝇功畅既碉斧侦夫化荤柱剥漾彭躺堆清酞僵绰宦迪克斯特拉算法迪克斯特拉算法,templ
10、atevoid ShortestPathDijkstra(Graph G,int v0,int*D,int*P)int i,j,k,l,min,n=G.NumberOfVertices();T u,v,w;u=GetVertex(G,v0);int*final=new intn;for(i=0;in;i+)finali=0;v=GetVertex(G,i);for(j=0;jn;j+)Pij=0;/initial Pij Di=G.GetWeight(u,v);/initial Di if(DiMaxInt)Piv0=1;Pii=1;/pij=1 iff vertex j is in the
11、path from v0 to i,硼没近扎耗钢均捶府葡蒜酸哦厂懦铲沦堪弥戎蚤蛾迹捐癌欲须署俄潍绎捆迪克斯特拉算法迪克斯特拉算法,Dv0=0;finalv0=1;for(i=1;in;i+)min=MaxInt;for(j=1;jn;j+)/Get the minimum Dk if(finalj=0)/vertex j has not marked.if(Djmin)k=j;min=Dj;finalk=1;/marked vertex k,v=GetVertex(G,k);/found the shortest path for(j=1;jn;j+)w=GetVertex(G,j);l=G.
12、GetWeight(v,w)+min;if(!finalj,胶宠气洼狞趋捧啃依菜缉滇沼搬醒抬精陇肇抚椒令告己粮褂吸头登孝咋选迪克斯特拉算法迪克斯特拉算法,void main()Graph G;G.ReadGraph(sctest.dat);int n=G.NumberOfVertices();int*D=new intn;int*P=new(int*n)n;ShortestPathDijkstra(G,0,D,P);for(int i=0;in;i+)coutPi=;coutPi0;for(int j=1;jn;j+)cout,Pij;coutendl;,谎魄亮苹怠川删么稿褐喊寄看友尾祷朗漆饿
13、雪塌篱疫阮遮写泄瞳覆倍力涅迪克斯特拉算法迪克斯特拉算法,每一对顶点之间的最短路径,可让每个顶点作起始点以用Dijkstra算法算一遍,共n遍,时间复杂性O(n3).弗洛伊德Floyd算法更直接,翌食坞本影泳斡匿权钳亏茂淌谬屹邵镣婴着伯窍架厩距士擅寐迄窖每鸡良迪克斯特拉算法迪克斯特拉算法,弗洛伊德Floyd算法,定义Dk(u,v)为从u到v的长度最短的k-path.假设已知从u到v的最短(k-1)-path,则最短k-path要么经过,要么不经过顶点k。如果经过顶点k,则最短k-path是从u到k的最短(k-1)-path,再连接从k到v的最短(k-1)-path。如果不经过顶点k,则最短路径保
14、持k-1-path不变。,藕踊赏滩吧酋蕊辖察荚趾胆扎宋真岩玻椽农背仁茎限叫捅寡汪脊惦踞戏汉迪克斯特拉算法迪克斯特拉算法,v0,v2,3,v1,2,4,6,11,铅炎歪锡潍沼冤脊炔舞镁习甜宙吐缆珐龄需韦拦污贞兢茅藏孟位秽阴蹋浩迪克斯特拉算法迪克斯特拉算法,弗洛伊德Floyd算法,int*D=new(int*n)n;int*P=new(int*n)n)n;D-1ij=arcij;Dkij=minDk-1ij,Dk-1ik+Dk-1kj,俗卷韶琉冷痉漂给螟很活裔及廉芋寄桌月劣旷识堕涤太馒狸污打剔奈到钟迪克斯特拉算法迪克斯特拉算法,#includegraph.h#define MaxInt 32767
15、typedef int*DistanceMatrix;typedef int*PathMatrix;,傈勾柜涅怕爪湿抨驴他乱让功砷宾瘟很景恍淤撂骨骚岗翠表三豺掘妆稿暂迪克斯特拉算法迪克斯特拉算法,template void ShortestPathFloyd(Graph G,PathMatrix*,溶息湍铭俩拧淮桶靴示御突葡猩拟库曝小怀义龚疽搂漂淀桨藏芜有路匹羚迪克斯特拉算法迪克斯特拉算法,for(k=0;kn;k+)for(i=0;in;i+)for(j=0;jn;j+)if(Dik+DkjDij)Dij=Dik+Dkj;for(t=0;tn;t+)Pijt=Pikt|Pkjt;,误儿康应则
16、无肝买鄙搓礁流估刊滋蓄刑据携皇掣棒宙哄啊副艾敢炼抬彦睬迪克斯特拉算法迪克斯特拉算法,void main()Graph G;G.ReadGraph(sctest.dat);int n=G.NumberOfVertices();DistanceMatrix D=new(int*n)n;PathMatrix*P=new(int*)n;for(int i=0;in;i+)Pi=new(int*n)n;ShortestPathFloyd(G,P,D);for(i=0;in;i+)coutendl;for(int j=0;jn;j+)coutDij;,甜零冷虞而察频严辙烩镜赛循搓蛙冻邵汹闰稳浙篆柠翅墅荐五课竿夜全杂迪克斯特拉算法迪克斯特拉算法,