The C++ Dijkstra is at:
http://www.cnblogs.com/tanky_woo/archive/2011/01/19/1939041.html
Calculate the path from 1 to 5!
Here is the Javascript version which is translated from above version:
<script type="text/javascript">
var maxnum = 100;
var maxint = 999999;
function Dijkstra(n, v, dist, prev, c)
{
var s = []; // 判断是否已存入该点到S集合中
for(var i=0; i<n; i++)
{
dist[i] = c[v][i];
s[i] = 0; // 初始都未用过该点
if(dist[i] == maxint)
prev[i] = 0;
else
prev[i] = v;
}
dist[v] = 0;
s[v] = 1;
// 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
// 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
for(var i=1; i<n; i++)
{
var tmp = maxint;
var u = v;
// 找出当前未使用的点j的dist[j]最小值
for(var j=0; j<n; j++) {
if((!s[j]) && dist[j]<tmp)
{
u = j; // u保存当前邻接点中距离最小的点的号码
tmp = dist[j];
}
}
s[u] = 1; // 表示u点已存入S集合中
// 更新dist
for(var j=0; j<n; j++) {
if((!s[j]) && c[u][j]<maxint)
{
var newdist = dist[u] + c[u][j];
if(newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
function searchPath(prev, v, u)
{
var que = [];
var tot = 0;
que[tot] = u;
tot++;
var tmp = prev[u];
while(tmp != v)
{
que[tot] = tmp;
tot++;
tmp = prev[tmp];
}
que[tot] = v;
var result = "";
for(var i=tot; i>=0; --i) {
if(i != 0) {
result += que[i] + " -> ";
} else {
result += que[i];
}
}
alert("源点到最后一个顶点的路径为: \n" + result);
}
function main()
{
// 各数组都从下标1开始
var dist = []; // 表示当前点到源点的最短路径长度
var prev = []; // 记录当前点的前一个结点
var c = []; // 记录图的两点间路径长度
var n, line; // 图的结点数和路径数
// 输入结点数
n = 5;
// 输入路径数
line = 7;
// 初始化c[]为maxint
for(var i=0; i<n; i++) {
c[i] = [];
for(var j=0; j<n; j++) {
c[i][j] = maxint;
}
}
c[0][1] = 10;
c[1][0] = 10;
c[0][3] = 30;
c[3][0] = 30;
c[0][4] = 100;
c[4][0] = 100;
c[1][2] = 50;
c[2][1] = 50;
c[2][4] = 10;
c[4][2] = 10;
c[3][2] = 20;
c[2][3] = 20;
c[3][4] = 60;
c[4][3] = 60;
for(var i=0; i<n; i++)
dist[i] = maxint;
var node = "顶点位置: \n";
for(var i=0; i<n; i++)
{
for(var j=0; j<n; j++) {
node += c[i][j] + "\t";
}
node += "\n";
}
alert(node);
Dijkstra(n, 0, dist, prev, c);
// 最短路径长度
alert("源点到最后一个顶点的最短路径长度: \n" + dist[n-1]);
// 路径
searchPath(prev, 0, n-1);
}
main();
</script>