单源最短路径的Dijkstra算法 最短路径 Dijkstra 算法为什么边上的权值非负阿?

Dijkstra's \u6700\u77ed\u8def\u5f84\u7b97\u6cd5\u80fd\u4e0d\u80fd\u89e3\u8fd9\u4e2a\u542b\u6709\u8d1f\u6743\u91cd\u7684\u95ee\u9898

Dijkstra\u7b97\u6cd5\u5f53\u4e2d\u5c06\u8282\u70b9\u5206\u4e3a\u5df2\u6c42\u5f97\u6700\u77ed\u8def\u5f84\u7684\u96c6\u5408\uff08\u8bb0\u4e3aS\uff09\u548c\u672a\u786e\u5b9a\u6700\u77ed\u8def\u5f84\u7684\u4e2a\u96c6\u5408\uff08\u8bb0\u4e3aU\uff09\uff0c\u5f52\u5165S\u96c6\u5408\u7684\u8282\u70b9\u7684\u6700\u77ed\u8def\u5f84\u53ca\u5176\u957f\u5ea6\u4e0d\u518d\u53d8\u66f4\uff0c\u5982\u679c\u8fb9\u4e0a\u7684\u6743\u503c\u5141\u8bb8\u4e3a\u8d1f\u503c\uff0c\u90a3\u4e48\u6709\u53ef\u80fd\u51fa\u73b0\u5f53\u4e0eS\u5185\u67d0\u70b9\uff08\u8bb0\u4e3aa\uff09\u4ee5\u8d1f\u8fb9\u76f8\u8fde\u7684\u70b9\uff08\u8bb0\u4e3ab\uff09\u786e\u5b9a\u5176\u6700\u77ed\u8def\u5f84\u65f6\uff0c\u5b83\u7684\u6700\u77ed\u8def\u5f84\u957f\u5ea6\u52a0\u4e0a\u8fd9\u6761\u8d1f\u8fb9\u7684\u6743\u503c\u7ed3\u679c\u5c0f\u4e8ea\u539f\u5148\u786e\u5b9a\u7684\u6700\u77ed\u8def\u5f84\u957f\u5ea6\uff0c\u800c\u6b64\u65f6a\u5728Dijkstra\u7b97\u6cd5\u4e0b\u662f\u65e0\u6cd5\u66f4\u65b0\u7684\uff0c\u7531\u6b64\u4fbf\u53ef\u80fd\u5f97\u4e0d\u5230\u6b63\u786e\u7684\u7ed3\u679c\u3002\u6c42\u5e26\u8d1f\u6743\u503c\u8fb9\u7684\u5355\u6e90\u6700\u77ed\u8def\u5f84\u53ef\u4ee5\u7528\u8d1d\u5c14\u66fc-\u798f\u7279\u7b97\u6cd5\u3002

Dijkstra\u7b97\u6cd5\u5f53\u4e2d\u5c06\u8282\u70b9\u5206\u4e3a\u5df2\u6c42\u5f97\u6700\u77ed\u8def\u5f84\u7684\u96c6\u5408\uff08\u8bb0\u4e3aS\uff09\u548c\u672a\u786e\u5b9a\u6700\u77ed\u8def\u5f84\u7684\u4e2a\u96c6\u5408\uff08\u8bb0\u4e3aU\uff09\uff0c\u5f52\u5165S\u96c6\u5408\u7684\u8282\u70b9\u7684\u6700\u77ed\u8def\u5f84\u53ca\u5176\u957f\u5ea6\u4e0d\u518d\u53d8\u66f4\uff0c\u5982\u679c\u8fb9\u4e0a\u7684\u6743\u503c\u5141\u8bb8\u4e3a\u8d1f\u503c\uff0c\u90a3\u4e48\u6709\u53ef\u80fd\u51fa\u73b0\u5f53\u4e0eS\u5185\u67d0\u70b9\uff08\u8bb0\u4e3aa\uff09\u4ee5\u8d1f\u8fb9\u76f8\u8fde\u7684\u70b9\uff08\u8bb0\u4e3ab\uff09\u786e\u5b9a\u5176\u6700\u77ed\u8def\u5f84\u65f6\uff0c\u5b83\u7684\u6700\u77ed\u8def\u5f84\u957f\u5ea6\u52a0\u4e0a\u8fd9\u6761\u8d1f\u8fb9\u7684\u6743\u503c\u7ed3\u679c\u5c0f\u4e8ea\u539f\u5148\u786e\u5b9a\u7684\u6700\u77ed\u8def\u5f84\u957f\u5ea6\uff0c\u800c\u6b64\u65f6a\u5728Dijkstra\u7b97\u6cd5\u4e0b\u662f\u65e0\u6cd5\u66f4\u65b0\u7684\uff0c\u7531\u6b64\u4fbf\u53ef\u80fd\u5f97\u4e0d\u5230\u6b63\u786e\u7684\u7ed3\u679c\u3002\u6c42\u5e26\u8d1f\u6743\u503c\u8fb9\u7684\u5355\u6e90\u6700\u77ed\u8def\u5f84\u53ef\u4ee5\u7528\u8d1d\u5c14\u66fc-\u798f\u7279\u7b97\u6cd5\u3002

将图G中所有的顶点V分成两个顶点集合S和T。以v为源点已经确定了最短路径的终点并入S集合中,S初始时只含顶点v,T则是尚未确定到源点v最短路径的顶点集合。然后每次从T集合中选择S集合点中到T路径最短的那个点,并加入到集合S中,并把这个点从集合T删除。直到T集合为空为止。
具体步骤
1、选一顶点v为源点,并视从源点v出发的所有边为到各顶点的最短路径(确定数据结构:因为求的是最短路径,所以①就要用一个记录从源点v到其它各顶点的路径长度数组dist[],开始时,dist是源点v到顶点i的直接边长度,即dist中记录的是邻接阵的第v行。②设一个用来记录从源点到其它顶点的路径数组path[],path中存放路径上第i个顶点的前驱顶点)。
2、在上述的最短路径dist[]中选一条最短的,并将其终点(即<v,k>)k加入到集合s中。
3、调整T中各顶点到源点v的最短路径。 因为当顶点k加入到集合s中后,源点v到T中剩余的其它顶点j就又增加了经过顶点k到达j的路径,这条路径可能要比源点v到j原来的最短的还要短。调整方法是比较dist[k]+g[k,j]与dist[j],取其中的较小者。
4、再选出一个到源点v路径长度最小的顶点k,从T中删去后加入S中,再回去到第三步,如此重复,直到集合S中的包含图G的所有顶点。 SPFA实际上是Bellman-Ford基础上的队列优化
SPFA(G,w,s)
1. INITIALIZE-SINGLE-SOURCE(G,s)
2. INITIALIZE-QUEUE(Q)
3. ENQUEUE(Q,s)
4. While Not EMPTY(Q)
5. Do u<-DLQUEUE(Q)
6. For 每条边(u,v) in E[G]
7. Do tmp<-d[v]
8. Relax(u,v,w)
9. If (d[v] < tmp) and (v不在Q中)
10. ENQUEUE(Q,v)
c++:
boolSPFA(intsource)
{
deque<int>dq;
inti,j,x,to;
for(i=1;i<=nodesum;i++)
{
in_sum[i]=0;
in_queue[i]=false;
dist[i]=INF;
path[i]=-1;
}
dq.push_back(source);
in_sum[source]++;
dist[source]=0;
in_queue[source]=true;
//初始化完成
while(!dq.empty())
{
x=dq.front();
dq.pop_front();
in_queue[x]=false;
for(i=0;i<adjmap[x].size();i++)
{
to=adjmap[x][i].to;
if((dist[x]<INF)&&(dist[to]>dist[x]+adjmap[x][i].weight))
{
dist[to]=dist[x]+adjmap[x][i].weight;
path[to]=x;
if(!in_queue[to])
{
in_queue[to]=true;
in_sum[to]++;
if(in_sum[to]==nodesum)
return false;
if(!dq.empty())
{
if(dist[to]>dist[dq.front()])
dq.push_back(to);
else
dq.push_front(to);
}
else
dq.push_back(to);
}
}
}
}
returntrue;
}



  • 鍗曟簮鏈鐭矾寰勭殑Dijkstra绠楁硶
    绛旓細鈶¤涓涓敤鏉ヨ褰曚粠婧愮偣鍒板叾瀹冮《鐐圭殑璺緞鏁扮粍path[],path涓瓨鏀捐矾寰勪笂绗琲涓《鐐圭殑鍓嶉┍椤剁偣锛夈2銆佸湪涓婅堪鐨鏈鐭矾寰dist[]涓変竴鏉℃渶鐭殑锛屽苟灏嗗叾缁堢偣锛堝嵆<v,k>锛塳鍔犲叆鍒伴泦鍚坰涓3銆佽皟鏁碩涓悇椤剁偣鍒版簮鐐箆鐨勬渶鐭矾寰勩 鍥犱负褰撻《鐐筴鍔犲叆鍒伴泦鍚坰涓悗锛屾簮鐐箆鍒癟涓墿浣欑殑鍏跺畠椤剁偣j灏卞張澧炲姞浜...
  • 浠ラ偦鎺ヨ〃浣滃瓨鍌ㄧ粨鏋勫疄鐜版眰婧愮偣鍒板叾浣欏悇椤剁偣鐨鏈鐭矾寰勭殑Dijkstra...
    绛旓細鍏蜂綋绠楁硶涓猴細//Dijkstra姹鍗曟簮鏈鐭矾寰 include<stdio.h> define N 20 //鍥剧殑椤剁偣鏈澶氭暟 define MAX 1000 define MIN -1 typedef int ElemType;//鍥剧殑椤剁偣鏍囪瘑锛岃繖閲屼负鑷劧鏁 //鍥剧殑缁撶偣缁撴瀯 typedef struct ArcNode{ ElemType adjvex;//鍥剧殑椤剁偣 锛堣寮ф寚鍚戦《鐐圭殑浣嶇疆锛塻truct ArcNode *nextarc...
  • Dijkstrath绠楁硶鏄粈涔?濡備綍鐢―ijkstrath绠楁硶姹傝绠楁満缃戠粶鎷撴墤鍥剧殑鏈鐭...
    绛旓細Dijkstra绠楁硶鏄吀鍨 鐨鍗曟簮鏈鐭矾寰绠楁硶锛岀敤浜庤绠椾竴涓妭鐐瑰埌鍏朵粬鎵鏈夎妭鐐圭殑鏈鐭矾寰勩備富瑕佺壒鐐规槸浠ヨ捣濮嬬偣涓轰腑蹇冨悜澶栧眰灞傛墿灞曪紝鐩村埌鎵╁睍鍒扮粓鐐逛负姝侱ijkstra绠楁硶鏄緢鏈変唬琛ㄦх殑鏈鐭矾寰勭畻娉曪紝鍦ㄥ緢澶氫笓涓氳绋嬩腑閮戒綔涓哄熀鏈唴瀹规湁璇︾粏鐨勪粙缁嶏紝濡傛暟鎹粨鏋勶紝鍥捐锛岃繍绛瑰绛夌瓑銆侱ijkstra涓鑸殑琛ㄨ堪閫氬父鏈変袱绉嶆柟寮忥紝涓...
  • Bellman-ford 鍗曟簮鏈鐭矾寰绠楁硶
    绛旓細鍙傝冿細 Bellman-Ford 鍗曟簮鏈鐭矾寰绠楁硶 Bellman-ford 绠楁硶 Bellman-Ford 绠楁硶鏄竴绉嶇敤浜庤绠楀甫鏉冩湁鍚戝浘涓崟婧愭渶鐭矾寰勶紙SSSP锛歋ingle-Source Shortest Path锛夌殑绠楁硶 瀵逛簬甯︽潈鏈夊悜鍥 G = (V, E)锛Dijkstra 绠楁硶瑕佹眰鍥 G 涓竟鐨勬潈鍊煎潎涓洪潪璐燂紝鑰孊ellman-ford鑳介傚簲涓鑸殑鎯呭喌锛堝嵆 瀛樺湪璐熸潈...
  • 鐢dijkstra绠楁硶璁$畻婧愮偣鍒颁釜缁撶偣鐨鏈鐭矾寰...璋㈣阿浜茬埍鐨勬湅鍙媬 璇︾粏...
    绛旓細Dijkstra绠楁硶鐨勫叿浣撴楠わ細Dijkstra绠楁硶鍙堢О涓鍗曟簮鏈鐭矾寰锛屾墍璋撳崟婧愭槸鍦ㄤ竴涓湁鍚戝浘涓紝浠庝竴涓《鐐瑰嚭鍙戯紝姹傝椤剁偣鑷虫墍鏈夊彲鍒拌揪椤剁偣鐨勬渶鐭矾寰勯棶棰樸傝G=锛圴锛孍锛夋槸涓涓湁鍚戝浘锛孷琛ㄧず椤剁偣锛孍琛ㄧず杈广傚畠鐨勬瘡涓鏉¤竟锛坕锛宩锛夊睘浜嶦锛岄兘鏈変竴涓潪璐熸潈W锛圛,j锛夛紝鍦℅涓寚瀹氫竴涓粨鐐箆0锛岃姹傛妸浠巚0...
  • 杩澃鏂壒鎷夌畻娉曟眰鍗曟簮鏈鐭矾寰鏃舵煇涓杞袱涓偣璺濈涓鏍锋椂鎬庝箞鍔瀇鐧惧害鐭...
    绛旓細鏉惧紱鎿嶄綔銆傝开鏉版柉鐗规媺绠楁硶鐢ㄤ簬瑙e喅鍥剧殑鍗曟簮鏈鐭矾寰闂锛屽嵆缁欏畾a鍜宐鐐癸紝姹俛鍒癰鐨勬渶鐭矾寰勩備粠缁欏畾鐨勮捣鐐瑰嚭鍙戯紝姹傚崟婧愭渶鐭矾寰勬椂鏌愪竴杞袱涓偣璺濈涓鏍锋椂锛岄夋嫨鍏朵腑涓涓娇鐢紝鐒跺悗浠ユ壘鍒扮殑鐐逛负涓浆鐐瑰仛鏉惧紱鎿嶄綔灏卞彲瀹屾垚銆
  • 璋佽兘涓句竴涓狿ascal涓Dijkstra绠楁硶姹鍗曟簮鏈鐭矾寰闂鐨勪緥瀛愬苟浣滀竴浜涜鏄...
    绛旓細棣栧厛鏉ュ垎鏋Dijkstra鐨勭畻娉曟濇兂 璁惧浘G鐢ㄩ偦鎺ョ煩闃电殑鏂瑰紡瀛樺偍鍦℅A涓紝GA[I锛宩]=maxint琛ㄧずvi锛寁j鏄笉鍏宠仈鐨勶紝鍚﹀垯涓烘潈鍊硷紙澶т簬0鐨勫疄鏁帮級銆傝闆嗗悎S鐢ㄦ潵瀛樺偍淇濆瓨宸叉眰寰鏈鐭矾寰勭殑缁堢偣搴忓彿锛屽垵濮嬫椂S=[vi]琛ㄧず鍙湁婧愮偣锛屼互鍚庢瘡姹傚嚭涓涓粓鐐箆j锛屽氨鎶婂畠鍔犲叆鍒伴泦鍚堜腑骞朵綔涓烘柊鑰冭檻鐨勪腑闂撮《鐐广傝鏁扮粍dist[1....
  • 鏈鐭矾寰 - Dijkstra绠楁硶
    绛旓細鎬濊矾灏辨槸杩欐牱锛屽線鍚庡氨鏄ぇ鍚屽皬寮備簡 绠楁硶缁撴潫 锛堝浘鐗囨潵婧愪簬缃戠粶锛Dijkstra绠楁硶淇濊瘉鑳芥壘鍒颁竴鏉′粠鍒濆鐐瑰埌鐩爣鐐圭殑鏈鐭矾寰锛屽彧瑕佹墍鏈夌殑杈归兘鏈変竴涓潪璐熺殑浠d环鍊笺傚湪涓婂浘涓紝绮夌孩鑹茬殑缁撶偣鏄垵濮嬬粨鐐癸紝钃濊壊鐨勬槸鐩爣鐐癸紝鑰岀被鑿卞舰鐨勬湁鑹插尯鍩熷垯鏄疍ijkstra绠楁硶鎵弿杩囩殑鍖哄煙銆傞鑹叉渶娣$殑鍖哄煙鏄偅浜涚鍒濆鐐规渶杩...
  • djstl绠楁硶?
    绛旓細瀹氫箟Dijkstra(杩澃鏂壒鎷)绠楁硶鏄吀鍨嬬殑鍗曟簮鏈鐭矾寰绠楁硶,鐢ㄤ簬璁$畻涓涓妭鐐瑰埌鍏朵粬鎵鏈夎妭鐐圭殑鏈鐭矾寰勩備富瑕佺壒鐐规槸浠ヨ捣濮嬬偣涓轰腑蹇冨悜澶栧眰灞傛墿灞,鐩村埌鎵╁睍鍒扮粓鐐逛负姝侱ijkstra绠楁硶鏄緢鏈変唬琛ㄦх殑鏈鐭矾寰勭畻娉,鍦ㄥ緢澶氫笓涓氳绋嬩腑閮戒綔涓哄熀鏈唴瀹规湁璇︾粏鐨勪粙缁,濡傛暟鎹粨鏋,鍥捐,杩愮瀛︾瓑绛夈侱ijkstra涓鑸殑琛ㄨ堪閫氬父鏈変袱绉嶆柟寮,涓绉...
  • 鎬庝箞鐢╟璇█瀹炵幇鍗曟簮鏈鐭矾寰闂?瑕佹眰鏄敤Dijkstra绠楁硶,鏈濂藉啓鍑烘墍鏈...
    绛旓細C璇█浠g爜锛//娓呭崕澶у鍑虹増绀惧厜鐩樼殑浠g爜 void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &P,ShortPathTable &D){ // 绠楁硶7.15 // 鐢Dijkstra绠楁硶姹傛湁鍚戠綉G鐨剉0椤剁偣鍒板叾浣欓《鐐箆鐨鏈鐭矾寰P[v]// 鍙婂叾甯︽潈闀垮害D[v]銆// 鑻[v][w]涓篢RUE锛屽垯w鏄粠v0鍒皏褰撳墠姹傚緱鏈鐭矾寰勪笂鐨勯《鐐...
  • 扩展阅读:dijkstra最短路径画图 ... dijkstra最短路径运筹学 ... dijkstra算法详细步骤 ... 单源最短路径画图 ... 单源最短路径求法图解 ... 单源最短路径java ... dijkstra经典例题及答案 ... 单源最短路径盒图步骤 ... dijkstra最短路径算法视频 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网