给你一个无向图,图中包含 5000 个点 m 个边,任意两个点之间的距离是 w ,无重边或自环。请求出1号点到n号点的最短距离。
注意:图中可能存在孤立点,即存在点与任意点都没有边相连
如果1号点不能到达n号点,输出-1.
第一行两个整数n和m,表示图的点和边数。接下来m行,每行三个整数u,v, w,表示u到v有一条无向边, 长度为w。![]()
![]()
![]()
输出一行,表示1到n的最短路,如不存在,输出-1.
4 4 1 2 3 2 4 7 3 4 5 3 1 3
8
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个点!!我说为什么一直错啊。。。认真读题很重要不能想当然啊