import java.io.*; import java.util.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); int n = Integer.parseInt(st.nextToken()); int m = Integer.parseInt(st.nextToken()); int s = Integer.parseInt(st.nextToken()); List<int[]>[] adj = new ArrayList[n + 1]; for (int i = 0; i <= n; i++) { adj[i] = new ArrayList<>(); } for (int i = 0; i < m; i++) { st = new StringTokenizer(br.readLine()); int u = Integer.parseInt(st.nextToken()); int v = Integer.parseInt(st.nextToken()); int w = Integer.parseInt(st.nextToken()); adj[u].add(new int[] {v, w}); } long[] dist = new long[n + 1]; Arrays.fill(dist, Long.MAX_VALUE); dist[s] = 0; PriorityQueue<long[]> pq = new PriorityQueue<>((a, b) -> Long.compare(a[1], b[1])); pq.add(new long[] {s, 0}); while (!pq.isEmpty()) { long[] node = pq.poll(); int u = (int) node[0]; long currentDist = node[1]; if (currentDist > dist[u]) { continue; } for (int[] edge : adj[u]) { int v = edge[0]; int w = edge[1]; if (dist[v] > currentDist + w) { dist[v] = currentDist + w; pq.add(new long[] {v, dist[v]}); } } } StringBuilder sb = new StringBuilder(); for (int i = 1; i <= n; i++) { if (i == s) { sb.append(0); } else { sb.append(dist[i] == Long.MAX_VALUE ? -1 : dist[i]); } if (i < n) { sb.append(' '); } } System.out.println(sb); } }
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:使用BufferedReader和StringTokenizer快速读取输入数据,构建邻接表。
- 初始化距离数组:将起点距离设为0,其余顶点设为无穷大。
- 优先队列处理:使用优先队列存储顶点及其当前最短距离,每次取出距离最小的顶点进行处理。
- 松弛操作:遍历当前顶点的所有出边,尝试更新目标顶点的最短距离。若更新成功,将目标顶点加入优先队列。
- 结果输出:遍历所有顶点,输出从起点到每个顶点的最短距离。若不可达,输出-1;起点到自身的距离始终为0。