Dijkstra算法总结

最近一个礼拜一直在研究js的Dijkstra算法,现在除了美工其他都已经解决,拿出来分享下。

首先先看一下算法介绍。

1,迪杰斯特拉算法介绍
迪杰斯特拉算法是典型最短路径算法,用于计算图或网中某个特定顶点到其他所有顶点的最短路径。主要特点是以起始点为中心向外,层层扩展,直到扩展覆盖所有顶点。
2,迪杰斯特拉算法思想
设G=(V,E)为一个带全有向图,把图中顶点集合V分成两组。第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将所到达最短路径的顶点加入到集合S中,直到全部顶点都加入到S中)。第二组为其余未确定最短路径的顶点集合(用U表示,U=V-S,U中的顶点不断的加入到S中,直到U为空,S=V)。在U加入S的过程中,始终保持源点到S中各顶点的最短路径长度小于或等于源点到U中任意顶点的最短路径长度。
3,迪杰斯特拉算法执行步骤
设 n 为图 G=(V,E) 中的顶点数,dist[n] 存放从源点到每个终点当前最短路径的长度,path[n] 存放相应路径,S 为已求得最短路径的终点的集合,U为V-S,初始为不含有源点的所有顶点。
(1)初始化已求的最短路径的集合S为只含有元素源点a,S={a}。
(2)从U中选取一个距离源点v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。
(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值为顶点k的距离加上顶点k到u边上的权。
(4)重复步骤(2)和(3)直到所有顶点都包含在S中。

4,一个js版的Dijkstra算法举例

var adjMatrix = null;

function Init() {
    adjMatrix = new Array();
    adjMatrix[0] = new Array(0, 2, 0, 0, 4);
    adjMatrix[1] = new Array(2, 0, 3, 6, 0);
    adjMatrix[2] = new Array(0, 3, 0, 2, 0);
    adjMatrix[3] = new Array(0, 6, 2, 0, 5);
    adjMatrix[4] = new Array(4, 0, 0, 5, 0);
}


function DijkstraPath(matrix, nVertexCount, n)   //n表示源顶点 matrix为图的邻接矩阵
{
	var i =0;
	var j = 0;
	var k = 0;
	var visited = new Array;
	var dist =  new Array();
	var path = new Array();

	for(i = 0;i<nVertexCount;i++)     //初始化dist数组
	{
	    if(matrix[n][i]>0 && i!=n)
	    {
	        dist[i] = matrix[n][i];
	        path[i] = n;     //path记录最短路径上从n到i的前一个顶点 
	    }
	    else
	    {
	        dist[i] = 10000;    //若i不与n直接相邻,则权值置为无穷大 
	        path[i] = -1;
	    }
	    visited[i] = false;
	    path[n] = n;
	    dist[n] = 0;
	}
	visited[n] = true;

	for(i = 1;i<nVertexCount;i++)     //循环扩展nVertexCount-1次 
	{
	    var min = 10000;
	    var u;
	    for(j = 0;j<nVertexCount;j++)    //寻找未被扩展的权值最小的顶点 
	    {
	        if(visited[j] == false && dist[j]<min)
	        {
	            min = dist[j];
	            u = j;        
	        }
	    } 
	    visited[u]=true;
	    for(k = 0;k<nVertexCount;k++)   //更新dist数组的值和路径的值 
	    {
	        if(visited[k]==false && matrix[u][k]>0 && min+matrix[u][k]<dist[k])
	        {
	            dist[k] = min+matrix[u][k];
	            path[k] = u; 
	        }
	    }        
	} 
	return path;  
}
function showPath(path,v,n)   //n到v的最短路径上的各个节点
{
	var p = "" + v;	
	while(v!=n)
	{  	
	    v = path[v];
	    p = p + "" + v;
	}
	alert(p);
}

function calculate() {
    Init();
    var sp = DijkstraPath(adjMatrix, 5, 0)
    showPath(sp, 3, 0);
}

calculate();
由于最近做的东西用于比赛,所以没法整体拿出来和大家分享,这个算是抛砖引玉吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值