js代码
var dijsktra_js=function (weight,start) {
var n = weight.length;
var shortPath = [];
for(var i=0;i<n;i++){
shortPath[i]=0;
}
var path=new Array(n);
for(var i=0;i<n;i++){
path[i]=start+"-"+i;
}
var visited = new Array(n);
for(var i=0;i<n;i++){
visited[i]=0;
}
shortPath[start] = 0;
visited[start] = 1;
for(var count = 1;count <= n - 1;count++)
{
var k = -1;
var dmin = MAX;
for(var i = 0;i < n;i++)
{
if(visited[i] == 0 && weight[start][i] < dmin)
{
dmin = weight[start][i];
k = i;
}
}
shortPath[k] = dmin;
visited[k] = 1;
for(var i = 0;i < n;i++)
{
if(visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]){
weight[start][i] = weight[start][k] + weight[k][i];
path[i]=path[k]+"-"+i;
}
}
}
for(var i=0;i<n;i++){
console.info("从"+start+"出发到"+i+"的最短路径为:"+path[i]);
}
return shortPath;
};
var fun_copy=function (i, j, value) {
lengthArr[i][j]=value;
lengthArr[j][i]=value;
};
var MAX=Number.MAX_VALUE;
var pointNumber=3;
var lengthArr=[];
for(var i=0;i<pointNumber;i++){
lengthArr[i]=[];
for(var j=0;j<pointNumber;j++){
lengthArr[i][j]=MAX;
}
}
fun_copy(0,1,3);
fun_copy(1,2,2);
dijsktra_js(lengthArr,2);
参考的java代码 (来自网络,忘记地址了。。。 )
public class Dijkstra {
static int M = 10000;//(此路不通)
public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] weight1 = {//邻接矩阵
{M, 3, M}, {3, M, 2}, {M, 2, M}
};
int[][] weight2 = {
{0, 10, M, 30, 100},//从0到0-n任一点
{M, 0, 50, M, M},//从1到0-n任一点
{M, M, 0, M, 10},
{M, M, 20, 0, 60},
{M, M, M, M, 0}
};
int[] shortPath = Dijsktra(weight1, 0);
for (int i = 0; i < shortPath.length; i++)
System.out.println("从" + 0 + "出发到" + i + "的最短距离为:" + shortPath[i]);
}
public static int[] Dijsktra(int[][] weight, int start) {
//接受一个有向图的权重矩阵,和一个起点编号start(从0编号,顶点存在数组中)
//返回一个int[] 数组,表示从start到它的最短路径长度
int n = weight.length; //顶点个数
int[] shortPath = new int[n]; //存放从start到其他各点的最短路径
String[] path = new String[n]; //存放从start到其他各点的最短路径的字符串表示
for (int i = 0; i < n; i++)
path[i] = new String(start + "-->" + i);
int[] visited = new int[n]; //标记当前该顶点的最短路径是否已经求出,1表示已求出
//初始化,第一个顶点求出
shortPath[start] = 0;
visited[start] = 1;
for (int count = 1; count <= n - 1; count++) //要加入n-1个顶点
{
int k = -1; //选出一个距离初始顶点start最近的未标记顶点
int dmin = Integer.MAX_VALUE;
for (int i = 0; i < n; i++) {
if (visited[i] == 0 && weight[start][i] < dmin) {
dmin = weight[start][i];
k = i;
}
}
// System.out.println("k="+k);
//将新选出的顶点标记为已求出最短路径,且到start的最短路径就是dmin
shortPath[k] = dmin;
visited[k] = 1;
//以k为中间点,修正从start到未访问各点的距离
for (int i = 0; i < n; i++) {
if (visited[i] == 0 && weight[start][k] + weight[k][i] < weight[start][i]) {
weight[start][i] = weight[start][k] + weight[k][i];
path[i] = path[k] + "-->" + i;
}
}
}
for (int i = 0; i < n; i++)
System.out.println("从" + start + "出发到" + i + "的最短路径为:" + path[i]);
System.out.println("=====================================");
return shortPath;
}
}