近期我写过了Prim和Kruskal的最小生成树算法,今天,我利用下班时间,给大家分享下Dijkstra的最短距离算法,希望有助于各位的学习。
代码如下:
package org.tree;
import java.util.Arrays;
public class DijkstraArithmetic {
private static final int INFINITE = 9999;
public static int[] Pathmatirx ;
public static int[] shortPathTable ;
public static void shortestPathDijkstra(int[][] matirx, int head, int vertexsSize){
Pathmatirx = new int[vertexsSize]; // 用于存储最短路径下标的数组
shortPathTable = new int[vertexsSize]; // 用于存储到各点最短路径的权值和
int[] flags = new int[vertexsSize];
// 得到该顶点的所有的权
for (int i = 0; i < vertexsSize; i++) {
shortPathTable[i] = matirx[head][i];
}
// 初始化
flags[head] = 1; // head顶点到head顶点不需要求路径
shortPathTable[head] = 0; // head顶点到head顶点为0
for (int i = 1; i < vertexsSize; i++) {
int min = INFINITE;
int minValueIndex = Integer.MAX_VALUE;
// 找到最小的路径,并通过minValueIndex参数标识
for (int j = 0; j < vertexsSize; j++) {
if(flags[j] != 1 && shortPathTable[j] < min){
min = shortPathTable[j];
minValueIndex = j;
}
}
// 将目前找到最近的顶点置为1
flags[minValueIndex] = 1;
// 修正当前最短路径及距离
for (int j = 0; j < vertexsSize; j++) {
if( flags[j] != 1 && (min+matirx[minValueIndex][j] < shortPathTable[j])){
// 以下说明有更短的路径存在,修改shortPathTable和Pathmatirx
shortPathTable[j] = min+matirx[minValueIndex][j];
Pathmatirx[j] = minValueIndex;
}
}
}
}
public static void main(String[] args) {
int[][] matrix = new int[5][5];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
matrix[i][j] = INFINITE;
}
}
matrix[0][1] = 10 ;
matrix[1][0] = 10 ;
matrix[1][3] = 13 ;
matrix[3][1] = 13 ;
matrix[0][4] = 7 ;
matrix[4][0] = 7 ;
matrix[0][2] = 3 ;
matrix[2][0] = 3 ;
matrix[3][4] = 5 ;
matrix[4][3] = 5;
matrix[2][4] = 2 ;
matrix[4][2] = 2 ;
shortestPathDijkstra(matrix,3,5);
// 以下是 顶点 matrix[3] 到各个顶点的短距离
for (int c = 0; c < 5; c++) {
System.out.println("顶点3到顶点"+c+"的最短距离是"+shortPathTable[c]);
}
}
}
注意:此算法是我在书上看到的,我仅仅只是将原来的C代码翻译成java代码,所以写的原创,请勿乱喷,希望大家学习开心!!!
(时间原因,这里我就不解释了,网上有资料的)
代码如下:
package org.tree;
import java.util.Arrays;
public class DijkstraArithmetic {
private static final int INFINITE = 9999;
public static int[] Pathmatirx ;
public static int[] shortPathTable ;
public static void shortestPathDijkstra(int[][] matirx, int head, int vertexsSize){
Pathmatirx = new int[vertexsSize]; // 用于存储最短路径下标的数组
shortPathTable = new int[vertexsSize]; // 用于存储到各点最短路径的权值和
int[] flags = new int[vertexsSize];
// 得到该顶点的所有的权
for (int i = 0; i < vertexsSize; i++) {
shortPathTable[i] = matirx[head][i];
}
// 初始化
flags[head] = 1; // head顶点到head顶点不需要求路径
shortPathTable[head] = 0; // head顶点到head顶点为0
for (int i = 1; i < vertexsSize; i++) {
int min = INFINITE;
int minValueIndex = Integer.MAX_VALUE;
// 找到最小的路径,并通过minValueIndex参数标识
for (int j = 0; j < vertexsSize; j++) {
if(flags[j] != 1 && shortPathTable[j] < min){
min = shortPathTable[j];
minValueIndex = j;
}
}
// 将目前找到最近的顶点置为1
flags[minValueIndex] = 1;
// 修正当前最短路径及距离
for (int j = 0; j < vertexsSize; j++) {
if( flags[j] != 1 && (min+matirx[minValueIndex][j] < shortPathTable[j])){
// 以下说明有更短的路径存在,修改shortPathTable和Pathmatirx
shortPathTable[j] = min+matirx[minValueIndex][j];
Pathmatirx[j] = minValueIndex;
}
}
}
}
public static void main(String[] args) {
int[][] matrix = new int[5][5];
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix.length; j++) {
matrix[i][j] = INFINITE;
}
}
matrix[0][1] = 10 ;
matrix[1][0] = 10 ;
matrix[1][3] = 13 ;
matrix[3][1] = 13 ;
matrix[0][4] = 7 ;
matrix[4][0] = 7 ;
matrix[0][2] = 3 ;
matrix[2][0] = 3 ;
matrix[3][4] = 5 ;
matrix[4][3] = 5;
matrix[2][4] = 2 ;
matrix[4][2] = 2 ;
shortestPathDijkstra(matrix,3,5);
// 以下是 顶点 matrix[3] 到各个顶点的短距离
for (int c = 0; c < 5; c++) {
System.out.println("顶点3到顶点"+c+"的最短距离是"+shortPathTable[c]);
}
}
}
注意:此算法是我在书上看到的,我仅仅只是将原来的C代码翻译成java代码,所以写的原创,请勿乱喷,希望大家学习开心!!!
(时间原因,这里我就不解释了,网上有资料的)
转载于:https://blog.51cto.com/2950606/1111146