单源最短路径算法java
时间: 2023-11-25 09:48:31 浏览: 32
单源最短路径算法是指在一个加权有向图中,从给定源点到所有其他点的最短路径问题。Java中可以使用Dijkstra算法实现单源最短路径。该算法的思路是从源点开始,每次选择当前距离源点最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其他所有点的最短路径。具体实现可以参考引用中的代码实现部分和引用中的算法思路和正确性分析部分。
相关问题
单源最短路径贪心算法Java
单源最短路径贪心算法有多种实现方式,其中比较常见的是Dijkstra算法和Bellman-Ford算法。下面是Dijkstra算法的Java实现:
```java
import java.util.*;
public class Dijkstra {
public static void main(String[] args) {
int n = 5; // 图中节点数
int[][] graph = new int[][]{
{0, 10, Integer.MAX_VALUE, 30, 100},
{Integer.MAX_VALUE, 0, 50, Integer.MAX_VALUE, Integer.MAX_VALUE},
{Integer.MAX_VALUE, Integer.MAX_VALUE, 0, Integer.MAX_VALUE, 10},
{Integer.MAX_VALUE, Integer.MAX_VALUE, 20, 0, 60},
{Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE, 0}
}; // 图的邻接矩阵表示
int[] dist = dijkstra(graph, n, 0); // 求从节点0出发到其他节点的最短距离
System.out.println(Arrays.toString(dist)); // 输出结果
}
public static int[] dijkstra(int[][] graph, int n, int start) {
int[] dist = new int[n]; // 存储从起点到各个节点的最短距离
boolean[] visited = new boolean[n]; // 标记节点是否已经被访问过
Arrays.fill(dist, Integer.MAX_VALUE); // 初始化距离为无穷大
dist[start] = 0; // 起点到自身的距离为0
for (int i = 0; i < n; i++) {
int u = -1;
for (int j = 0; j < n; j++) {
if (!visited[j] && (u == -1 || dist[j] < dist[u])) {
u = j;
}
}
visited[u] = true;
for (int v = 0; v < n; v++) {
if (!visited[v] && graph[u][v] != Integer.MAX_VALUE) {
dist[v] = Math.min(dist[v], dist[u] + graph[u][v]);
}
}
}
return dist;
}
}
```
单源最短路径贪心算法java
单源最短路径问题可以使用Dijkstra算法或者Bellman-Ford算法来解决。其中,Dijkstra算法是一种贪心算法,可以用于求解非负权重的最短路径问题,它的核心思想是找到当前未访问的最短路径节点,并将其加入到已访问节点集合中。
下面是基于Java语言实现的Dijkstra算法示例代码,假设有n个节点,源节点为s,邻接矩阵为graph,dist数组记录源节点s到各个节点的最短距离(初始时dist[s]=0,其他节点的dist值为无穷大):
```
public static void dijkstra(int[][] graph, int n, int s, int[] dist) {
boolean[] visited = new boolean[n]; // 标记节点是否已被访问
visited[s] = true;
for (int i = 0; i < n; i++) {
dist[i] = graph[s][i]; // 初始化源节点到各个节点的距离
}
for (int i = 0; i < n - 1; i++) {
int minDist = Integer.MAX_VALUE;
int minIndex = -1;
// 找到当前未访问节点中距离源节点最近的节点
for (int j = 0; j < n; j++) {
if (!visited[j] && dist[j] < minDist) {
minDist = dist[j];
minIndex = j;
}
}
if (minIndex == -1) {
break; // 如果所有节点都已访问,则退出循环
}
visited[minIndex] = true;
// 更新当前节点的邻接节点到源节点的距离
for (int j = 0; j < n; j++) {
if (!visited[j] && graph[minIndex][j] != Integer.MAX_VALUE) {
dist[j] = Math.min(dist[j], dist[minIndex] + graph[minIndex][j]);
}
}
}
}
```
在上述代码中,使用visited数组标记节点是否已被访问,使用dist数组记录源节点s到各个节点的最短距离。在每次迭代中,找到当前未访问节点中距离源节点最近的节点,并将其加入到已访问节点集合中。然后,更新当前节点的邻接节点到源节点的距离,若距离更短则更新dist数组中的值。最终,dist数组中记录的就是源节点到各个节点的最短距离。