import java.util.*; public class 1450 { static int N, M; static int[] dist; static boolean[] visited; static List<Edge>[] graph; public static void main(String[] args) { Scanner sc = new Scanner(System.in); N = sc.nextInt(); M = sc.nextInt(); dist = new int[N + 1]; visited = new boolean[N + 1]; graph = new List[N + 1]; for (int i = 1; i <= N; i++) { graph[i] = new ArrayList<>(); } for (int i = 0; i < M; i++) { int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); graph[a].add(new Edge(b, c)); graph[b].add(new Edge(a, c)); } int start = sc.nextInt(); int end = sc.nextInt(); int res = dijkstra(start, end); if (res == Integer.MAX_VALUE) { System.out.println("No solution"); } else { System.out.println(res); } } private static int dijkstra(int start, int end) { Arrays.fill(dist, Integer.MAX_VALUE); dist[start] = 0; PriorityQueue<Node> pq = new PriorityQueue<>(); pq.offer(new Node(start, 0)); while (!pq.isEmpty()) { Node curr = pq.poll(); int u = curr.vertex; if (visited[u]) { continue; } visited[u] = true; if (u == end) { return dist[end]; } for (Edge edge : graph[u]) { int v = edge.to; int w = edge.weight; if (!visited[v] && dist[u] != Integer.MAX_VALUE && dist[u] + w < dist[v]) { dist[v] = dist[u] + w; pq.offer(new Node(v, dist[v])); } } } return Integer.MAX_VALUE; } } class Node implements Comparable<Node> { int vertex; int dist; public Node(int vertex, int dist) { this.vertex = vertex; this.dist = dist; } @Override public int compareTo(Node o) { return this.dist - o.dist; } } class Edge { int to; int weight; public Edge(int to, int weight) { this.to = to; this.weight = weight; } }解释该代码
时间: 2024-04-27 17:23:07 浏览: 119
java代码-import java.util.Scanner;
这是一个使用 Dijkstra 算法求解最短路径的 Java 代码。该代码的输入包括节点数 N、边数 M、每条边的起点、终点和边权,以及起点 start 和终点 end,输出为起点到终点的最短路径长度。
代码中使用了一个 Node 类表示节点和距离,一个 Edge 类表示边和边权,一个 graph 数组存储每个节点连接的边,一个 dist 数组存储每个节点到起点的距离,一个 visited 数组存储每个节点是否被访问过。在 dijkstra 方法中,使用优先队列 pq 存储每个节点和距离的 Node 对象,每次取出队列中距离最小的节点 curr,将其标记为 visited,如果该节点为终点则返回其到起点的距离,否则遍历其连接的所有边,更新每个边的终点节点 v 的距离,如果 v 未被访问过且起点到 u 的距离加上 u 到 v 的边权小于当前 dist[v],则更新 dist[v] 并将 v 和新的距离加入队列 pq。
注意,该代码的节点编号从 1 开始,使用了 Java 的 List、PriorityQueue 等数据结构,以及 Arrays.fill、Scanner 等 Java 内置函数。
阅读全文