单元最短路径问题---Dijkstra算法

最短路径—Dijkstra算法和Floyd算法(理解):https://blog.csdn.net/m0_37345402/article/details/76695930

理解最短路径——迪杰斯特拉(dijkstra)算法:https://www.cnblogs.com/iambupu/p/5713952.html

最短路径问题---Dijkstra算法详解:https://blog.csdn.net/qq_35644234/article/details/60870719

 

单元最短路径的定义: 从V0到其余各个顶点的最短路径。

最短路径:

      V0到其余各个顶点Vk的最短路径,要么从V0到Vk的直接路径的权值;要么从V0,经过已经找到的最短路径的顶点,从该顶点到Vk的路径权值之和。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
元最路径算法是指在一个加权有向图或者无向图中,从一个源点到所有其他顶点的最路径算法。其中,边的权重必须为非负数。Java中可以使用Dijkstra算法和Bellman-Ford算法来实现单元路径算法。 Dijkstra算法的基本思想是:设立一个集合S,存放已经求得最路径的顶点,以及一个数组dist,表示源点到各个顶点的最距离。初始时,集合S中只有源点,dist数组中除了源点为0外,其余元素都为无穷大。然后,每次从dist数组中选择最小值对应的顶点,加入集合S中,并更新dist数组。具体实现可以使用优先队列来优化时间复杂度。 Bellman-Ford算法的基本思想是:设立一个数组dist,表示源点到各个顶点的最距离,初始时,dist数组中除了源点为0外,其余元素都为无穷大。然后,对于每一条边(u,v),如果dist[u]+w(u,v)<dist[v],则更新dist[v]为dist[u]+w(u,v)。重复执行V-1次后,如果还存在dist[u]+w(u,v)<dist[v]的情况,则说明存在负权回路。 下面是Java代码示例: ```java // Dijkstra算法 public void dijkstra(int[][] graph, int src) { int n = graph.length; int[] dist = new int[n]; boolean[] visited = new boolean[n]; PriorityQueue<Integer> pq = new PriorityQueue<>(n, (a, b) -> dist[a] - dist[b]); Arrays.fill(dist, Integer.MAX_VALUE); dist[src] = 0; pq.offer(src); while (!pq.isEmpty()) { int u = pq.poll(); if (visited[u]) { continue; } visited[u] = true; for (int v = 0; v < n; v++) { if (graph[u][v] > 0 && !visited[v] && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; pq.offer(v); } } } } // Bellman-Ford算法 public void bellmanFord(int[][] graph, int src) { int n = graph.length; int[] dist = new int[n]; Arrays.fill(dist, Integer.MAX_VALUE); dist[src] = 0; for (int i = 1; i < n; i++) { for (int u = 0; u < n; u++) { for (int v = 0; v < n; v++) { if (graph[u][v] > 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) { dist[v] = dist[u] + graph[u][v]; } } } } for (int u = 0; u < n; u++) { for (int v = 0; v < n; v++) { if (graph[u][v] > 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) { System.out.println("图中存在负权回路"); return; } } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值