精准核酸检测

题目描述

为了达到新冠疫情精准防控的需要,为了避免全员核酸检测带来的浪费,需要精准圈定可能被感染的人群。

现在根据传染病流调以及大数据分析,得到了每个人之间在时间、空间上是否存在轨迹的交叉。

现在给定一组确诊人员编号 (X1,X2,X3,...Xn)在所有人当中,找出哪些人需要进行核酸检测,输出需要进行核酸检测的数。

(注意:确诊病例自身不需要再做核酸检测)需要进行核酸检测的人,是病毒传播链条上的所有人员,即有可能通过确诊病例所能传播到的所有人。

例如:A是确诊病例,A和B有接触、B和C有接触 C和D有接触,D和E有接触。那么B、C、D、E都是需要进行核酸检测的人

输入描述

第一行为总人数N

第二行为确证病例人员编号(确证病例人员数量<N),用逗号隔开

接下来N行,每一行有N个数字,用逗号隔开,其中第i行的第j个数字表名编号i是否与编号j接触过。0表示没有接触,1表示有接触

备注:

人员编号从0开始

0 < N < 100 0<N<1000<N<100

输出描述

输出需要做核酸检测的人数

用例

输入

复制代码
5
1,2
1,1,0,1,0
1,1,0,0,0
0,0,1,0,1
1,0,0,1,0
0,0,1,0,1

输出

复制代码
3

说明

编号为1、2号的人员为确诊病例

1号与0号有接触,0号与3号有接触,2号与4号有接触。所以,需要做核酸检测的人是0号、3号、4号,总计3人要进行核酸检测。

解题思路

本题要求根据确诊病例及其接触关系,找出所有可能被传播到的人员(即接触链上的所有人),但确诊病例本身不需要检测。

我们可以将人员看作图的节点,接触关系看作无向边(因为接触是相互的),然后从所有确诊病例出发进行广度优先搜索(BFS),遍历所有可达节点,并统计除确诊病例外的节点数量。

步骤详解

1.读取输入

  • 第一行:总人数 N。
  • 第二行:确诊病例编号列表,用逗号分隔。
  • 接下来 N 行:每行 N 个数字(0 或 1),用逗号分隔,表示第 i 行的人与第 j 列的人是否有接触。

2.构建接触图

  • 使用二维数组 matrix 存储接触关系,matrixij = 1 表示 i 和 j 有接触。
  • 由于接触是双向的,我们直接使用该矩阵进行 BFS 遍历即可(当 matrixcurj == 1 时,j 可被 cur 传播)。

3.BFS 搜索

  • 初始化一个布尔数组 visited 标记已访问的人,将确诊病例全部标记并加入队列。
  • 当队列非空时,弹出当前人员 cur,遍历所有可能接触的人 j:若 matrixcurj == 1 且 j 未被访问,则标记 j 并入队,同时计数器加 1(表示需要核酸检测的新人员)。
  • 注意:确诊病例本身不计入计数器。

4.输出结果

  • 最后输出计数器的值,即为需要做核酸检测的人数。
java 复制代码
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int n = Integer.parseInt(scanner.nextLine());
    String[] split = scanner.nextLine().split(",");

    int[] confirmed = new int[split.length];
    for (int i = 0; i < split.length; i++) {
        confirmed[i] = Integer.parseInt(split[i]);
    }

    int[][] matrix = new int[n][n];
    for (int i = 0; i < n; i++) {
        String[] rows = scanner.nextLine().split(",");
        for (int j = 0; j < n; j++) {
            matrix[i][j] = Integer.parseInt(rows[j]);
        }
    }
    scanner.close();

    boolean[] visited = new boolean[n];
    Queue<Integer> queue = new LinkedList<>();
    for (int c : confirmed) {
        queue.offer(c);
        visited[c] = true;
    }

    int count = 0;
    while (!queue.isEmpty()) {
        Integer cur = queue.poll();

        for (int i = 0; i < n; i++) {
            if (matrix[cur][i] == 1 && !visited[i]) {
                visited[i] = true;
                count++;
                queue.offer(i);
            }
        }
    }

    System.out.println(count);
}
相关推荐
Jerry29 分钟前
LeetCode 28. 找出字符串中第一个匹配项的下标
算法
Jerry2 小时前
LeetCode 459. 重复的子字符串
算法
闲猫5 小时前
Spring AI 对接Deepseek ChatModel 聊天对话
java·前端·spring
海石5 小时前
1500分的题目,确实有实力,不过还是我略胜一筹
算法·leetcode
海石5 小时前
【记忆化搜索】条条大路通AC,走好适合你的那一条,走到后再考虑走得快
算法·leetcode
自信的未来7 小时前
JSON 工具|Web Worker 工程化打包 + 语法自动修复 + 多语言代码生成实战
java·前端·json
Brookty7 小时前
【JavaEE】线程安全(一).4:写块串行保安全、CAS
java·开发语言·java-ee·多线程·线程安全
Jerry7 小时前
LeetCode 151. 反转字符串中的单词
算法
怕孤单的草丛7 小时前
缓存管理面临的主要问题
java·数据库·缓存