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));
String[] parts = br.readLine().split(" ");
int n = Integer.parseInt(parts[0]);
int m = Integer.parseInt(parts[1]);
int q = Integer.parseInt(parts[2]);
// 构建邻接表
List<int[]>[] graph = new ArrayList[n + 1];
for (int i = 1; i <= n; i++) {
graph[i] = new ArrayList<>();
}
for (int i = 0; i < m; i++) {
parts = br.readLine().split(" ");
int u = Integer.parseInt(parts[0]);
int v = Integer.parseInt(parts[1]);
int w = Integer.parseInt(parts[2]);
graph[u].add(new int[] {v, w});
graph[v].add(new int[] {u, w});
}
// Dijkstra算法计算最短路径
long[] dist = new long[n + 1];
Arrays.fill(dist, Long.MAX_VALUE);
dist[1] = 0;
PriorityQueue<long[]> heap = new PriorityQueue<>(Comparator.comparingLong(
a -> a[0]));
heap.offer(new long[] {0, 1});
while (!heap.isEmpty()) {
long[] current = heap.poll();
long d = current[0];
int u = (int) current[1];
if (d > dist[u]) {
continue;
}
for (int[] edge : graph[u]) {
int v = edge[0];
int w = edge[1];
if (dist[v] > d + w) {
dist[v] = d + w;
heap.offer(new long[] {dist[v], v});
}
}
}
// 统计每个学校出现的次数
int[] count = new int[n + 1];
parts = br.readLine().split(" ");
for (int i = 0; i < q; i++) {
int a = Integer.parseInt(parts[i]);
count[a]++;
}
// 计算总距离
long sum = 0;
for (int i = 2; i <= n; i++) {
if (count[i] > 0) {
sum += (long) count[i] * 2 * dist[i];
}
}
System.out.println(sum);
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
- 输入处理:使用BufferedReader读取输入数据,构建邻接表表示图的边。
- Dijkstra算法:通过优先队列优化最短路径计算,从美食街(1号结点)出发,计算到各个学校的最短路径。
- 统计订单次数:记录每个学校的外卖订单次数。
- 总距离计算:根据每个学校的订单次数和最短路径,计算总骑行距离并输出结果。



京公网安备 11010502036488号