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();
由於最近做的東西用於比賽,所以沒法整體拿出來和大家分享,這個算是拋磚引玉吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章