DijkstraAlgorithms
(tips MarkDown ✔:✔
)
Table | BFSAlgorithm | DijkstraAlgorithm | FloyAlgorithm |
---|---|---|---|
无权图 | ✔ | ✔ | ✔ |
带权图 | x | ✔ | ✔ |
带负全职图 | x | x | ✔ |
带负权回路 | x | x | x |
时间复杂度 | O(n2)或O(v+e) | O(n2) | O(n3) |
通用于 | 求无权图的单源最短路径 | 求带权图的单源最短路径 | 求带权图的多源最短路径 |
BFS算法时间取决于使用的数组结构数据结构
public static void main(String[] args) {
int min = 65535;
char[] vertexs = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
int[][] matrix = {{0, 7, min, 5, min, min, min},
{7, 0, 8, 9, 7, min, min},
{min, 8, 0, min, 5, min, min},
{5, 9, min, 0, 15, 6, min},
{min, 7, 5, 15, 0, 8, 9},
{min, min, min, 6, 8, 0, 11},
{min, min, min, min, 9, 11, 0}};
DijkstraShortestRoad(vertexs,matrix,1);
}
public static void DijkstraShortestRoad(char[] vertexs, int[][] matrix, int start) {
//顶点个数
int n = vertexs.length;
//保存起始点到各点的最短路径大小
int[] sr = new int[n];
//标记当前顶点是否访问
int[] visited = new int[n];
//记录最短路径的遍历顺序
String[] path = new String[n];
//初始化标记路径
for (int i = 0; i < n; i++) {
path[i] = new String(vertexs[start] + "-->" + vertexs[i]);
}
//第一个顶点已经访问,且路径是0
sr[start] = 0;
visited[start] = 1;
//遍历n-1次除源点外的所有顶点
for (int i = 1; i < n; i++) {
int min = Integer.MAX_VALUE;
int index = 0;
//找出从源点出发到其他节点的最短路径,并且记录下
for (int j = 0; j < n; j++) {
if (visited[j] == 0 && matrix[start][j] < min) {
min = matrix[start][j];
index = j;
}
}
//更新访问数组和选中的节点距离
sr[index] = min;
visited[index] = 1;
//更新最短路径
for (int j = 0; j < n; j++) {
if (visited[j] == 0 && matrix[start][index] + matrix[index][j] < matrix[start][j]){
matrix[start][j] = matrix[start][index] + matrix[index][j];
path[j] = path[index] + "-->" + vertexs[j];
}
}
}
for (int j = 0; j < n; j++) {
System.out.println(path[j]+"的最短路径为:"+sr[j]);
}
}