Dijkstra算法求最短路径(java)

任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式用OPEN,CLOSE表的方式,其采用的是贪心法的
摘要由CSDN通过智能技术生成
任务描述:在一个无向图中,获取起始节点到所有其他节点的最短路径描述

Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN, CLOSE表方式
用OPEN,CLOSE表的方式,其采用的是贪心法的算法策略,大概过程如下:
1.声明两个集合,open和close,open用于存储未遍历的节点,close用来存储已遍历的节点
2.初始阶段,将初始节点放入close,其他所有节点放入open
3.以初始节点为中心向外一层层遍历,获取离指定节点最近的子节点放入close并从新计算路径,直至close包含所有子节点

代码实例如下:
Node对象用于封装节点信息,包括名字和子节点
public class Node {
	private String name;
	private Map<Node,Integer> child=new HashMap<Node,Integer>();
	public Node(String name){
		this.name=name;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Map<Node, Integer> getChild() {
  • 10
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
Dijkstra算法是一种解图中最短路径的经典算法,可以用Java语言来实现。具体实现方法如下: 1. 定义一个长度为n的布尔型数组visited,表示每个节点是否已被访问过,初始化所有值为false; 2. 定义一个长度为n的整型数组distance,表示起点到每个节点的距离,初始化起点的值为0,其余节点的值为无限大(设为Integer.MAX_VALUE); 3. 定义一个长度为n的整形数组predecessor,表示每个节点的前驱节点,初始化所有值为null; 4. 从起点开始,将distance值最小的节点标记为已访问过,然后更新与该节点相邻的节点的distance值和predecessor值; 5. 重复上述步骤,直到所有节点都被标记为已访问或者没有与起点相连的节点可访问; 6. 最后得到起点到终点的最短路径。 代码示例: ``` public class Dijkstra { public static void dijkstra(int[][] graph, int start) { int n = graph.length; boolean[] visited = new boolean[n]; int[] distance = new int[n]; Integer[] predecessor = new Integer[n]; Arrays.fill(visited, false); Arrays.fill(distance, Integer.MAX_VALUE); distance[start] = 0; for (int i = 0; i < n - 1; i++) { int minDistance = Integer.MAX_VALUE; int minNode = -1; for (int j = 0; j < n; j++) { if (!visited[j] && distance[j] < minDistance) { minDistance = distance[j]; minNode = j; } } if (minNode == -1) { break; } visited[minNode] = true; for (int j = 0; j < n; j++) { if (graph[minNode][j] > 0 && distance[minNode] + graph[minNode][j] < distance[j]) { distance[j] = distance[minNode] + graph[minNode][j]; predecessor[j] = minNode; } } } // print result for (int i = 0; i < n; i++) { if (i == start) { continue; } if (distance[i] == Integer.MAX_VALUE) { System.out.println(String.format("No path from %d to %d", start, i)); } else { List<Integer> path = new ArrayList<>(); int node = i; while (node != start) { path.add(node); node = predecessor[node]; } path.add(start); Collections.reverse(path); System.out.println(String.format("Shortest path from %d to %d: %s (distance=%d)", start, i, path, distance[i])); } } } public static void main(String[] args) { int[][] graph = {{0, 1, 4, 0, 0}, {1, 0, 2, 5, 0}, {4, 2, 0, 1, 3}, {0, 5, 1, 0, 2}, {0, 0, 3, 2, 0}}; dijkstra(graph, 0); } } ``` 此代码演示了如何用Java语言实现Dijkstra算法出从节点0到其余节点的最短路径算法基本思路是:先初始化distance数组,然后从distance值最小的未访问节点开始遍历,更新与该节点相邻的节点的distance值和predecessor值,直到所有节点都被访问或者没有可访问的节点为止。最后,可以根据predecessor数组得到从起点到终点的最短路径

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值