首页 > 试题广场 >

【模板】单源最短路2

[编程题]【模板】单源最短路2
  • 热度指数:16234 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给你一个无向图,图中包含 5000 个点 m 个边,任意两个点之间的距离是 w ,无重边或自环。请求出1号点到n号点的最短距离。

注意:图中可能存在孤立点,即存在点与任意点都没有边相连

如果1号点不能到达n号点,输出-1.



输入描述:
第一行两个整数n和m,表示图的点和边数。
接下来m行,每行三个整数u,v, w,表示u到v有一条无向边, 长度为w。


输出描述:
输出一行,表示1到n的最短路,如不存在,输出-1.

示例1

输入

4 4
1 2 3
2 4 7
3 4 5
3 1 3

输出

8
示例2

输入

4 3
1 2 5
2 3 3
3 1 3

输出

-1

说明

1号点不能到4号点。
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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String[] line = br.readLine().split(" ");
        int n = Integer.parseInt(line[0]);
        int m = Integer.parseInt(line[1]);

        // 初始化节点数组(索引从1到5000)
        Point[] points = new Point[5001];
        for (int i = 1; i <= 5000; i++) {
            points[i] = new Point(i);
        }

        // 读取边
        for (int i = 0; i < m; i++) {
            line = br.readLine().split(" ");
            int u = Integer.parseInt(line[0]);
            int v = Integer.parseInt(line[1]);
            int w = Integer.parseInt(line[2]);

            // 无向图,添加双向边
            points[u].vectors.put(v, w);
            points[v].vectors.put(u, w);
        }

        // 使用优先队列实现Dijkstra算法
        PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[1] - b[1]);
        pq.offer(new int[] {1, 0}); // [节点, 距离]
        points[1].score = 0; // 起点距离为0

        while (!pq.isEmpty()) {
            int[] cur = pq.poll();
            int node = cur[0];
            int dist = cur[1];

            // 如果当前距离大于记录的距离,表示已经访问了,跳过
            if (dist != points[node].score) continue;


            // 到达终点,输出结果
            if (node == n) {
                bw.write(String.valueOf(dist));
                bw.flush();
                bw.close();
                return;
            }

            // 遍历邻居节点
            for (Map.Entry<Integer, Integer> entry : points[node].vectors.entrySet()) {
                int neighbor = entry.getKey();
                int weight = entry.getValue();
                int newDist = dist + weight;

                if (newDist < points[neighbor].score) {
                    points[neighbor].score = newDist;
                    pq.offer(new int[] {neighbor, newDist});
                }
            }
        }

        // 无法到达终点
        bw.write("-1");
        bw.flush();
        bw.close();
    }

    static class Point {
        int number;
        HashMap<Integer, Integer> vectors; 
        int score; 

        public Point(int number) {
            this.number = number;
            this.vectors = new HashMap<>();
            this.score = Integer.MAX_VALUE;
        }
    }
}
5000个点!!我说为什么一直错啊。。。认真读题很重要不能想当然啊

发表于 2025-08-08 00:36:42 回复(0)