精准核酸检测

题目描述

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

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

现在给定一组确诊人员编号 (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 存储接触关系,matrix[i][j] = 1 表示 i 和 j 有接触。
  • 由于接触是双向的,我们直接使用该矩阵进行 BFS 遍历即可(当 matrix[cur][j] == 1 时,j 可被 cur 传播)。

3.BFS 搜索

  • 初始化一个布尔数组 visited 标记已访问的人,将确诊病例全部标记并加入队列。
  • 当队列非空时,弹出当前人员 cur,遍历所有可能接触的人 j:若 matrix[cur][j] == 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);
}
相关推荐
Lei活在当下2 小时前
先用起来,再理解,关于协程Coroutine应该知道的事
android·java·jvm
Java爱好狂.2 小时前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
tongluowan0073 小时前
以ReentrantLock为例解释AQS的工作流程
java·模板方法模式·aqs·reentrantlock
身如柳絮随风扬4 小时前
Java 项目打包与部署完全指南:JAR vs WAR,从构建到运行
java·firefox·jar
云烟成雨TD4 小时前
Spring AI Alibaba 1.x 系列【62】时光旅行(Time-Travel)
java·人工智能·spring
smj2302_796826525 小时前
解决leetcode第3943题递增后的数对数量
数据结构·python·算法·leetcode
浩少7025 小时前
【无标题】
java·开发语言
一棵白菜5 小时前
java 学习
java
卷毛的技术笔记5 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
炽烈小老头5 小时前
【每天学习一点算法 2026/05/25】矩阵中的最长递增路径
学习·算法·矩阵