OD_2024_C卷_200分_3、电脑病毒感染【JAVA】【图论 / 单源最短路径(dijkstra)】

题目描述

一个局域网内有很多台电脑,分别标注为 0 ~ N-1 的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用 t 表示。

其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。如果最后有电脑不会感染,则返回-1。

给定一个数组 times 表示一台电脑把相邻电脑感染所用的时间。

如图:pathi = {i, j, t} 表示:电脑 i->j,电脑 i 上的病毒感染 j,需要时间 t。

输入描述

复制代码
4
3
2 1 1
2 3 1
3 4 1
2

输出描述

复制代码
2

用例1

输入

复制代码
4
3
2 1 1
2 3 1
3 4 1
2

输出

复制代码
2

说明

复制代码
第一个参数:局域网内电脑个数N,1 ≤ N ≤ 200;

第二个参数:总共多少条网络连接

第三个 2 1 1 表示2->1时间为1

第六行:表示病毒最开始所在电脑号2

代码

java 复制代码
package odjava;

import java.util.*;

public class 三_电脑病毒感染 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 读取节点数和边数
        int n = sc.nextInt(); // 节点数
        int m = sc.nextInt(); // 边数

        // 创建邻接表来表示图
        HashMap<Integer, ArrayList<int[]>> graph = new HashMap<>();

        // 读取边的信息并构建邻接表
        for (int i = 0; i < m; i++) {
            int u = sc.nextInt(); // 出发点
            int v = sc.nextInt(); // 目标点
            int w = sc.nextInt(); // 出发点到达目标点的耗时

            // 添加边到邻接表
            graph.putIfAbsent(u, new ArrayList<>());
            graph.get(u).add(new int[]{v, w});
        }

        // 记录源点到其他节点的最短耗时
        int[] dist = new int[n + 1];
        // 初始化源点到其他节点的最短耗时为无穷大
        Arrays.fill(dist, Integer.MAX_VALUE);

        // 源点的编号
        int src = sc.nextInt();
        // 源点到自身的最短耗时为0
        dist[src] = 0;

        // 创建优先队列,用于存储待探索的节点
        // 优先队列中节点的优先级按照其到源点的距离排序,距离越小优先级越高
        PriorityQueue<Integer> needCheck = new PriorityQueue<>((a, b) -> dist[a] - dist[b]);
        // 将源点加入优先队列
        needCheck.add(src);

        // 记录节点是否已经被访问过
        boolean[] visited = new boolean[n + 1];
        visited[src] = true;

        // 进行 Dijkstra 算法的核心步骤,找到源点到其他节点的最短路径
        while (!needCheck.isEmpty()) {
            // 取出当前最短距离的节点
            int cur = needCheck.poll();
            visited[cur] = false;

            // 遍历当前节点的所有邻居节点
            if (graph.containsKey(cur)) {
                for (int[] next : graph.get(cur)) {
                    int v = next[0]; // 邻居节点编号
                    int w = next[1]; // 当前节点到邻居节点的边的权重

                    // 计算从源点经当前节点到达邻居节点的距离
                    int newDist = dist[cur] + w;

                    // 如果新距离比之前记录的距离要小,则更新距离并加入优先队列
                    if (newDist < dist[v]) {
                        dist[v] = newDist; // 更新距离
                        if (!visited[v]) {
                            // 如果邻居节点不在优先队列中,则将其加入队列
                            visited[v] = true;
                            needCheck.add(v);
                        }
                    }
                }
            }
        }

        // 找到源点到其他节点的最大耗时,即最长路径
        int maxTime = 0;
        for (int i = 1; i <= n; i++) {
            maxTime = Math.max(maxTime, dist[i]);
        }

        // 如果存在无法到达的节点,则输出 -1;否则输出最大耗时
        System.out.println(maxTime == Integer.MAX_VALUE ? -1 : maxTime);
    }
}
相关推荐
liangbo726 分钟前
01-Java 集合框架全景:从 Collection 到 Map 一张关系网理清
java
xuxigifxfh30 分钟前
HJ15 求int型正整数在内存中存储时1的个数
java·开发语言·华为机考
Wokoo733 分钟前
自动化测试入门:核心场景、回归测试与 Web 自动化环境搭建
java·开发语言·测试工具
我是人✓1 小时前
Spring IOC注解全解析和Spring整合测试单元
java·后端·spring
智购科技无人售货机工厂店1 小时前
玻璃瓶饮料破损率突然上升,排查发现是取货口缓冲垫老化了~YH
java·开发语言·人工智能·python·eclipse
镜象科技1 小时前
中小学AI心理健康解决方案服务商怎么选?2026年选型参考
android·java·人工智能
阿狗童鞋1 小时前
高并发系统设计实战指南
java·spring boot·spring cloud
Sam_Deep_Thinking1 小时前
CountDownLatch实现原理
java·后端·面试·程序员
小狼Solar1 小时前
SAP MDG 功能范围说明(基于S/4HANA 2025)
java·开发语言
范中勤1 小时前
Python 与 Java:模块、包、对象、反射核心差异总结
java·python·面试·反射·元类