Dijkstra 算法

来源:互联网 发布:区块链 拜占庭算法 编辑:程序博客网 时间:2024/05/22 00:12
package dijkstra;import java.util.ArrayList;import java.util.HashSet;import java.util.List;import java.util.Set;public class Dijkstra {public static int U = 99999999; // 此路不通static class Path2Len {public List<Integer> shortPath;public int shortLen;public Path2Len(int start) {this.shortPath = new ArrayList<Integer>();this.shortPath.add(start);this.shortLen = U;}}public static void main(String[] args) {int[][] graph = { { 0, 10, U, 30, 100 }, { U, 0, 50, U, U },{ U, U, 0, U, 10 }, { U, U, 20, 0, 60 }, { U, U, U, U, 0 } };int start = 0;Path2Len[] path2Len = dijkstra(graph, start);for (int i = 0; i < path2Len.length; i++) {System.out.println("从" + start + "出发到" + i + "的最短长度为:"+ path2Len[i].shortLen + ", 具体路径:" + path2Len[i].shortPath);}}public static Path2Len[] dijkstra(int[][] graph, int start) {int vertexCount = graph.length; // 顶点数// 一维数组path2LenArray,保存出发点到其余点的距离和路径Path2Len[] path2LenArray = new Path2Len[vertexCount];// 保存未访问的点Set<Integer> unVistedVetrixSet = new HashSet<Integer>();// 初始化path2LenArray,用连接矩阵初始化for (int i = 0; i < vertexCount; i++) {Path2Len path2Len = new Path2Len(start);path2Len.shortLen = graph[start][i];path2LenArray[i] = path2Len;unVistedVetrixSet.add(i);}// 出发点已经访问unVistedVetrixSet.remove(start);// 查询 N-1 次while (!unVistedVetrixSet.isEmpty()) {// 先从path2LenArray 查询一个未访问的最近点int minIndex = -1;int minLen = U;for (int column = 0; column < path2LenArray.length; column++) {if (unVistedVetrixSet.contains(column)) {if (path2LenArray[column].shortLen < minLen) {minLen = path2LenArray[column].shortLen;minIndex = column;}}}if (minLen >= U) {break;}// 查找到最近点minIndex,设置为已经访问unVistedVetrixSet.remove(minIndex);System.out.println("minIndex = " + minIndex + " found ");// 根据查找到的minIndex 和连接矩阵,更新path2LenArrayfor (int column = 0; column < path2LenArray.length; column++) {if (unVistedVetrixSet.contains(column)) {int old_start_2_column = path2LenArray[column].shortLen;int new_start_2_column = path2LenArray[minIndex].shortLen+ graph[minIndex][column];if (new_start_2_column < old_start_2_column) {path2LenArray[column].shortLen = new_start_2_column;path2LenArray[column].shortPath.clear();path2LenArray[column].shortPath.addAll(path2LenArray[minIndex].shortPath);path2LenArray[column].shortPath.add(column);}}}}return path2LenArray;}}


可以看出,Dijstra算法的时间复杂度为N^2


0 0
原创粉丝点击