├── Dijkstra.html ├── Dijkstra.js ├── README.md └── photoshow.js /Dijkstra.html: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 10 | 11 | Dijkstra单源最短路径算法 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 166 |
167 |

Dijkstra算法单源最短路径搜索演示 168 | 169 | Star 170 |

171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 |
181 |
182 | 输入权值并按确定更改
183 |
184 |
185 |
取消

186 |
更改

187 |
删除该链路
188 |
189 |
190 |

操作说明

191 | 生成节点

输入节点数后点击生成节点

192 | 生成链路

鼠标点击两个节点之后即可生成链路

193 | 修改链路权值

鼠标点击链路权值,在弹框中修改,也可以在弹框中选择删除该链路

194 | 生成最短路径

输入出发节点后点击生成,即可开始动态演示路径查找

195 | 算法讲解

Dijkstra单源最短路径——小鸡博客

196 | 源码地址 197 | Fork 198 | Follow 199 |

200 | 201 |
202 |
203 |
204 | 210 | 211 | 593 | 594 | 595 | 596 | -------------------------------------------------------------------------------- /Dijkstra.js: -------------------------------------------------------------------------------- 1 | 2 | var MaxvertextType = 100 3 | var gigantic = 99999 4 | 5 | //邻接矩阵 6 | function Mgraph() { 7 | this.vex=new Array(); 8 | this.edge=new Array(); 9 | this.vexnum=MaxvertextType; 10 | this.arcnum=MaxvertextType; 11 | }; 12 | 13 | function getVex(G,x){ 14 | var i=0; 15 | for(;G.vex[i]!=x;i++); 16 | return i; 17 | } 18 | 19 | 20 | //单源最短路径算法 21 | function Dijkstra(g,x){ 22 | var vexnum=g.vexnum; 23 | var vex=getVex(g,x); 24 | var dist= new Array(); 25 | var path = new Array(); 26 | path[0]=0; 27 | for (var i = 0; i < vexnum; ++i) { 28 | dist[i]=g.edge[vex][i]; 29 | if(dist[i]!=gigantic)path[i]=0; 30 | } 31 | var S = new Array(); 32 | S[0] = true; 33 | var dd; 34 | var dvex=0; 35 | for (var j = 0; j < vexnum-1; ++j) { 36 | dd=gigantic; 37 | for (var i = 1; i < vexnum; ++i) { 38 | if(dist[i]
38 | 39 | 40 | 41 | **部分javascript代码** 42 | 43 | ```java 44 | 45 | var MaxvertextType = 100 46 | var gigantic = 99999 47 | 48 | //邻接矩阵 49 | function Mgraph() { 50 | this.vex=new Array(); 51 | this.edge=new Array(); 52 | this.vexnum=MaxvertextType; 53 | this.arcnum=MaxvertextType; 54 | }; 55 | 56 | function getVex(G,x){ 57 | var i=0; 58 | for(;G.vex[i]!=x;i++); 59 | return i; 60 | } 61 | 62 | 63 | //单源最短路径算法 64 | function Dijkstra(g,x){ 65 | var vexnum=g.vexnum; 66 | var vex=getVex(g,x); 67 | var dist= new Array(); 68 | var path = new Array(); 69 | path[0]=0; 70 | for (var i = 0; i < vexnum; ++i) { 71 | dist[i]=g.edge[vex][i]; 72 | if(dist[i]!=gigantic)path[i]=0; 73 | } 74 | var S = new Array(); 75 | S[0] = true; 76 | var dd; 77 | var dvex=0; 78 | for (var j = 0; j < vexnum-1; ++j) { 79 | dd=gigantic; 80 | for (var i = 1; i < vexnum; ++i) { 81 | if(dist[i]
{ 87 | 88 | if (v.parentNode.localName!='a') { 89 | v.id=imgid; 90 | imgid++; 91 | v.addEventListener("click",function(e){ // 注册事件 92 | // 记录小图的位置个大小 93 | x=e.target.offsetLeft; 94 | y=e.target.offsetTop; 95 | w=e.target.offsetWidth; 96 | h=e.target.offsetHeight; 97 | src=e.target.src; 98 | id=e.target.id; 99 | // 创建遮罩层 100 | div=document.createElement("div"); 101 | div.style.cssText=` 102 | position:fixed; 103 | left:0; 104 | top:0; 105 | bottom:0; 106 | right:0; 107 | background-color: rgba(25,25,25,0.8); 108 | z-index:99999999; 109 | transition:all .3s cubic-bezier(0.165, 0.84, 0.44, 1); 110 | `; 111 | document.body.appendChild(div); 112 | setTimeout(function(){ 113 | div.style.opacity=1; 114 | },0); 115 | // (此处可以加loading) 116 | 117 | // 创建副本 118 | img=new Image(); 119 | btnright=document.createElement("button"); 120 | btnleft=document.createElement("button"); 121 | img.src=src; 122 | style(); 123 | 124 | 125 | btnleft.onclick=function(){ 126 | if(id===0){ 127 | alert("已经是第一张了!"); 128 | return; 129 | } 130 | var left=document.getElementById(id-1); 131 | img.src=left.src; 132 | x=left.offsetLeft; 133 | y=left.offsetTop; 134 | w=left.offsetWidth; 135 | h=left.offsetHeight; 136 | style(); 137 | id--; 138 | } 139 | btnright.onclick=function(){ 140 | id++; 141 | if(id>=imgid){ 142 | alert("已经是最后一张了!"); 143 | return; 144 | } 145 | var right=document.getElementById(id); 146 | img.src=right.src; 147 | x=right.offsetLeft; 148 | y=right.offsetTop; 149 | w=right.offsetWidth; 150 | h=right.offsetHeight; 151 | style(); 152 | 153 | } 154 | img.onload=function(){ 155 | document.body.appendChild(img); 156 | document.body.appendChild(btnright); 157 | document.body.appendChild(btnleft); 158 | 159 | // 浏览器宽高 160 | wh=window.innerHeight; 161 | ww=window.innerWidth; 162 | 163 | // 目标宽高和坐标 164 | if(w/h> 0; 167 | tx=(ww - tw) / 2; 168 | ty=40; 169 | } 170 | else{ 171 | tw=ww*0.8; 172 | th=h/w*tw >> 0; 173 | tx=ww*0.1; 174 | ty=(wh-th)/2; 175 | } 176 | 177 | // 延迟写入否则不会有动画 178 | setTimeout(function(){ 179 | img.style.opacity=1; 180 | img.style.height=th+"px"; 181 | img.style.width=tw+"px"; 182 | img.style.left=tx+"px"; 183 | img.style.top=ty+"px"; 184 | btnleft.style.left=(tx-90)+"px"; 185 | btnleft.style.top=(ty+th/2)+"px"; 186 | btnright.style.left=(tx+tw+40)+"px"; 187 | btnright.style.top=(ty+th/2)+"px"; 188 | // 点击隐藏 189 | div.onclick=img.onclick=closeMove; 190 | },10); 191 | }; 192 | });//end event 193 | } 194 | });//end forEach --------------------------------------------------------------------------------