有人想旅行某个城市的六个地点,每个地点之间的路线权重值不一样(权重值类型为double),从任意地点出发,求经过所有节点一次的最短路径长度并输出该路径经历城市的顺序,给出解题思路及相应较为简单易懂的java代码
时间: 2024-03-11 13:49:40 浏览: 55
最短路径的java程序
这个问题可以通过使用Dijkstra算法来解决,这是一种基于贪心策略的单源最短路径算法。我们可以使用一个优先队列来存储当前已知最短路径的节点,并按照路径长度的大小来排序。
以下是相应的Java代码:
```java
import java.util.*;
public class ShortestPath {
private int V; //节点数量
private List<List<Edge>> adj; //存储边和相应权重的邻接表
public ShortestPath(int V) {
this.V = V;
adj = new ArrayList<>(V);
for (int i = 0; i < V; i++) {
adj.add(new ArrayList<>());
}
}
public void addEdge(int u, int v, double w) {
Edge edge = new Edge(u, v, w);
adj.get(u).add(edge);
adj.get(v).add(edge);
}
public void dijkstra(int src) {
double[] dist = new double[V]; //存储源节点到各个节点的距离
Arrays.fill(dist, Double.MAX_VALUE); //先将距离初始化为无穷大
dist[src] = 0;
PriorityQueue<Edge> pq = new PriorityQueue<>(Comparator.comparingDouble(e -> e.weight)); //按照边权重排序的优先队列
pq.offer(new Edge(-1, src, 0)); //把源节点加入队列(前驱节点为-1)
boolean[] visited = new boolean[V]; //标记节点是否被访问过
while (!pq.isEmpty()) {
Edge edge = pq.poll();
int u = edge.v;
if (visited[u]) continue; //如果节点已经被访问过,则跳过
visited[u] = true; //标记节点已访问
for (Edge e : adj.get(u)) {
int v = e.u == u ? e.v : e.u;
double w = e.weight;
if (!visited[v] && dist[u] + w < dist[v]) {
dist[v] = dist[u] + w;
pq.offer(new Edge(u, v, dist[v]));
}
}
}
//打印最短路径长度和经过城市的顺序
System.out.println("最短路径长度为:" + dist[src]);
System.out.print("经过城市的顺序为:" + src);
int prev = src;
for (int i = 1; i < V; i++) {
double minDist = Double.MAX_VALUE;
int next = -1;
for (Edge e : adj.get(prev)) {
int v = e.u == prev ? e.v : e.u;
if (!visited[v] && dist[v] < minDist) {
minDist = dist[v];
next = v;
}
}
if (next != -1) {
System.out.print(" -> " + next);
prev = next;
}
}
}
static class Edge {
int u, v;
double weight;
public Edge(int u, int v, double weight) {
this.u = u;
this.v = v;
this.weight = weight;
}
}
public static void main(String[] args) {
ShortestPath graph = new ShortestPath(6);
graph.addEdge(0, 1, 2);
graph.addEdge(0, 2, 3);
graph.addEdge(1, 3, 4);
graph.addEdge(1, 4, 5);
graph.addEdge(2, 4, 6);
graph.addEdge(3, 5, 7);
graph.addEdge(4, 5, 8);
graph.dijkstra(0);
}
}
```
在这个示例中,我们使用了一个6个节点的图,并为每条边指定了相应的权重。我们通过调用`dijkstra`方法来计算从节点0开始的最短路径。输出将包括最短路径长度和经过城市的顺序。
阅读全文