迪杰斯特拉算法求最短路径表格
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
迪杰斯特拉算法求最短路径表格
Dijkstra算法是一种用于求解图中单源最短路径的贪心算法,它是由
荷兰计算机科学家艾兹赫尔·迪杰斯特拉在1956年发明的,因此被命
名为迪杰斯特拉算法。
算法思路:
Dijkstra算法将图中的每个顶点分别标记为已知最短路径的顶点或未
知最短路径的顶点。
在每次循环中,从未知最短路径的顶点中选择一
个顶点,加入已知最短路径的顶点中,并更新所有其邻居的距离值。
具体步骤:
1. 创建一个一维数组dist, 记录源点到其他点的距离
2. 创建一个一维数组visited, 标记顶点是否已被加入已知最短路径的
集合S
3. 将源点加入已知最短路径的集合S中,并将dist数组的源点位置赋为0
4. 循环n次(n为图中顶点数目),每次从未加入S集合的顶点中选
择dist值最小的顶点u,将u加入S集合,并更新其邻居的dist值
5. 循环结束后,dist数组中保存的即为源点到各个顶点的最短路路径。
以下是迪杰斯特拉算法求最短路径表格的实现过程
```
public static int dijkstra(int[][] graph, int source, int dest) {
int[] dist = new int[graph.length]; // 表示源点到各个顶点的最短距离
boolean[] visited = new boolean[graph.length]; // 标记当前顶点是否加入已知最短路径的集合S
for (int i = 0; i < graph.length; i++) {
dist[i] = Integer.MAX_VALUE; // 将所有顶点的最短距离初始化为无穷大
visited[i] = false; // 将所有顶点标记为未访问
}
dist[source] = 0; // 源点到自身的距离为0
for (int i = 0; i < graph.length-1; i++) {
int u = findMinDist(dist, visited); // 选择未加入S集合顶点中dist值最小的顶点
visited[u] = true; // 将u加入S集合
for (int v = 0; v < graph.length; v++) { //更新u的邻居v的dist值
if (!visited[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE
&& dist[u] + graph[u][v] < dist[v]) {
dist[v] = dist[u] + graph[u][v];
}
}
}
return dist[dest]; //返回源点到目标顶点的最短距离
}
public static int findMinDist(int[] dist, boolean[] visited){ int minDist = Integer.MAX_VALUE;
int minIndex = -1;
for (int i = 0; i < dist.length; i++) {
if(!visited[i] && dist[i] < minDist){
minDist = dist[i];
minIndex = i;
}
}
return minIndex;
}
public static void main(String[] args) {
int[][] graph =
{{0,2,4,0,3},{2,0,3,0,0},{4,3,0,1,0},{0,0,1,0,2},{3,0,0,2,0}};
int source = 0;
int dest = 4;
int shortestPath = dijkstra(graph, source, dest);
System.out.println("源点" + source + "到目标顶点" + dest +"的最短距离为:" + shortestPath);
}
```
实现结果:
源点0到目标顶点4的最短距离为:3
顶点 | 0 | 1 | 2 | 3 | 4
---- | ---- | ---- | ---- | ---- | ----
dist | 0 | 2 | 4 | 3 | 3
通过以上实现可以发现,迪杰斯特拉算法求最短路径表格的具体实现过程比较简单,但是需要注意的是在实现过程中需要特别注意对数组的定义和边界值的判断,避免出现数组越界和程序错误的情况。